给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案。如果数字最前面有0不输出。
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出最小数。
2.问题分析
如果要从178543中取出1个数,使这个数最小,应该取8
如果要从17543中取出1个数,使这个数最小,应该取7
如果要从1543中取出1个数,使这个数最小,应该取5
可以发现:1,7,8是一个不降序数列(有相等的升序),也就是逐渐变多,而8,5,4,3是一个不升序数列(有相等的降序),逐渐减少。
8正好是升序数列的最后一个,也是降序数列的第一个。
贪心选择性质:找到第一个升序数列的末尾并取出它就可以算成功完成了“局部的最优解”,再通过这个继续取出更多的数,直到取出k个数来
3.算法描述
使用一个字符数组来存储n位的正整数,用函数strlen求出数组长度,遍历数组,找到非降序末位数,用后一位覆盖那一位数(删数)
!!!注意输出最高位为0的问题
4.时间及空间复杂度分析
时间复杂度:代码主函数最多两层循环,循环k次,时间复杂度为O(n^2)
空间复杂度:定义了一个char数组来存储a,a共有n位,空间复杂度为O(n)
5.思考与体会
贪心算法首先需要得到局部最优解,再推导全局最优解。关键是找到贪心策略
(1)把求解的问题分成若干个子问题
(2)对每一子问题求解,得到子问题的局部最优解
(3)把子问题的解局部最优解合成原来解问题的一个解