第四章实践
- 实践题目
- 问题描述
- 算法描述
- 算法时间及空间复杂度分析(要有分析过程)
- 心得体会(对本次实践收获及疑惑进行总结)
1.
删数问题
2.
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
3.
贪心算法策略是每次删除一个数字,都要保证删除后这个数是当前最小的,就是说如果要删除4个数字,就是把问题分为4个,每一个就是当前的数删一个数字后变成最小的数,而方法就是较大的数位删掉, 从第一位数开始检索,找到一个数比它后面的数大,就把这个数删掉,如果整个数是按升序的,就从后面开始删。核心算法如下:
for(int i=1;i<=s;++i)
{
for(int j=0;j<len-1;j++)
if(n[j]>n[j+1])
{
for(int k=j;k<len-1;++k)
n[k]=n[k+1];
break;
}
len--;
}
查找比后面的数大的数并删掉,都符合的话就从后面删起。
4.
空间复杂度显而易见就是一位数组,即O(n)
时间复杂度,因为有两个循环,就是O(s*len-1)就是平方的复杂度,表示为O(n^2)
5.
这次最大的体会就是,贪心算法一定理解透彻,策略不能错,一开始做的时候我先把数字降序排序,每次删掉最大的一个,但是却忽略一个很重要的问题,比如12354删掉一个数变最小,的确是删掉最大的5,但是如果是123546,这时候就不是删掉最大的6了,而是删掉5,因为这个数是一个整体,我当时就没考虑到数位的问题,所以策略应该是每次删掉那个不符合非降序的那个数,删到整个数都是非降序为止,然后如果还要删除的话,就删后面几个数。

浙公网安备 33010602011771号