1.問題描述
4-2 刪數問題 (30 分)
給定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)把子問題的解局部最優解合成原來解問題的一個解