算法第4章实验报告
一、题目
4-2 删数问题
二、算法描述
为了让删数后的数最小,高位应该尽可能的小,所以在使用贪心算法策略的时候应该从最高位作比较删除。
确定我们的贪心策略:当当前的数,比后一位数大时,删去当前的数。
删去数的时候,需要多一个下标变量 j 去代表遍历的 i 变量去删数。
这道题有个坑点,那就是前导零,需要注意100000,删除1后结果应为0
三、代码实现
#include <iostream> #include <string.h> using namespace std; char a[1000]; int k,i,len; int flag=1; int main() { cin>>a>>k; len=strlen(a); //数组a的长度 while(k!=0) //只要s不为0,就继续减数 { i=0; while(a[i]<=a[i+1]) //升序数列 ,不再是升序就退出循环 i++; while(i<len-1) //删除 { a[i]=a[i+1]; i++; } len--; k--; } for(int i=0;i<len;i++) { if(a[i]=='0'&&i<len-1&&flag==1) //排除最高位为0的情况 continue; else{ cout<<a[i]; flag=0; } } return 0; }
四、算法时间复杂度
删数过程中,k次循环删数中嵌套两个与输入字符串长度n相关的循环,则时间复杂度为:O(k*n*n)
删数完成之后,一次检查0的循环:O(n)
则最后的时间复杂度为:O(n²)
五、贪心算法的个人体会和理解
贪心算法主要思路是:
(1)把求解的问题分成若干个子问题;
(2)对每个子问题求解,得到子问题的局部最优解;
(3)把子问题的局部最优解合成原来问题的一个解。
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。