摘要:當(dāng)我們用盡了所有刪除時(shí),就保留后面所有的數(shù)字,不再進(jìn)行任何比較。因?yàn)槲覀円呀?jīng)盡可能獲得了最小的最高位,因此無論后面的數(shù)字如何取值,其最高位上的數(shù)字一定是可以獲得的最小的這個(gè)數(shù)字。
題目要求
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible. Note: The length of num is less than 10002 and will be ≥ k. The given num does not contain any leading zero. Example 1: Input: num = "1432219", k = 3 Output: "1219" Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest. Example 2: Input: num = "10200", k = 1 Output: "200" Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes. Example 3: Input: num = "10", k = 2 Output: "0" Explanation: Remove all the digits from the number and it is left with nothing which is 0.
假設(shè)現(xiàn)在有一個(gè)用字符串表示的非負(fù)的整數(shù),問從中刪除掉k個(gè)數(shù)字后能夠得到的最小結(jié)果是多少?
思路和代碼直觀的來說,刪除數(shù)字得到最小的數(shù)字意味著我們應(yīng)當(dāng)盡可能的將越小的數(shù)字保留在高位,因此當(dāng)我們從左往右遍歷時(shí),一旦遇到比前一個(gè)數(shù)字更小的數(shù)字,就應(yīng)當(dāng)刪除前一個(gè)數(shù)字而保留這個(gè)數(shù)字。當(dāng)我們用盡了所有刪除時(shí),就保留后面所有的數(shù)字,不再進(jìn)行任何比較。因?yàn)槲覀円呀?jīng)盡可能獲得了最小的最高位,因此無論后面的數(shù)字如何取值,其最高位上的數(shù)字一定是可以獲得的最小的這個(gè)數(shù)字。舉個(gè)例子:
10200 k=1 第一步: 0和1比較,此時(shí)0比1小,且還有一次可用的刪除,因此刪除1,保留0 第二步:因?yàn)闊o可用的刪除次數(shù),因此剩下的值全部保留 123450123 k=5 第一步:2>1 保留 第二步:3>2 保留 第三步: 4>3 保留 第四步: 5>4 保留 第五步:0<5 刪除5 保留0 k=4 第六步: 0<4 刪除4 保留0 k=3 第七步:0<3 刪除3 保留0 k=2 第八步:0<2 刪除2 保留0 k=1 第九步:0<1 刪除1 保留0 k=0 第十步: 此時(shí)所有的刪除次數(shù)用完,因此剩余的值全部保留
可以看到,當(dāng)我們遇到較小值時(shí),我們會(huì)盡可能的將其往左邊移動(dòng),因?yàn)橹灰茸筮叺闹敌∏沂S鄤h除次數(shù),則刪除左邊的值一定會(huì)得到一個(gè)更小的值。
代碼如下:
public String removeKdigits(String num, int k) { if(num == null || num.length() == 0 || k==num.length()) return "0"; Stackstack = new Stack<>(); for(int i = 0 ; i < num.length() ; i++) { char c = num.charAt(i); while(k> 0 && !stack.isEmpty() && stack.peek() > c) { stack.pop(); k--; } stack.push(c); } while(k > 0) { stack.pop(); k--; } StringBuilder result = new StringBuilder(); while(!stack.isEmpty()) { result.append(stack.pop()); } while(result.length() > 1 && result.charAt(result.length()-1) == "0") { result.deleteCharAt(result.length()-1); } return result.reverse().toString(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/73610.html
摘要:題目鏈接根據(jù)題目的描述,移掉個(gè)數(shù)字然后得到最小值,肯定是。后面的和需要移掉也是同理。用個(gè)來保存之前遞增的數(shù)字。注意這個(gè)例子,去掉之后,最高位是,也得去掉。 402. Remove K Digits 題目鏈接:https://leetcode.com/problems... 根據(jù)題目的描述,移掉k個(gè)數(shù)字然后得到最小值,肯定是greedy。那么greedy的feature是什么呢?看例子,...
摘要:每個(gè)字母只留一個(gè),而且保證字典序最小。從前往后掃描,還要往前看一個(gè)檢出是否刪除的,要用解。需要一個(gè)數(shù)據(jù)結(jié)構(gòu)記錄是否使用這個(gè)字母,可以用。結(jié)構(gòu)也可以用數(shù)組加頂點(diǎn)指針模擬。 316 Remove Duplicate Given a string which contains only lowercase letters, remove duplicate letters so that e...
摘要:此模型的特殊性相鄰的三個(gè)值可以得到一個(gè)爆破值,相鄰的兩個(gè)值相當(dāng)于沒有值,賦予類比二分法求極值。通過二分確定具體的位置。此處二分法到極值是三個(gè)連續(xù)的數(shù),從相鄰三個(gè)數(shù)的固定值,逐次放寬范圍,確定越來越寬的爆破值。 此題的總結(jié): 求解 最大爆破值, 是一個(gè) 倒序 二分法問題,最終的原子結(jié)構(gòu)是連續(xù)的三個(gè)數(shù)。連續(xù)的三個(gè)數(shù),可以 往上遞推 間隔一個(gè)數(shù)的三個(gè)數(shù),間隔n個(gè)數(shù)的三個(gè)數(shù)特點(diǎn)在于:每一...
摘要:算法復(fù)雜度思路貪心算法,先能組成的數(shù)的組合,然后針對(duì)每一個(gè)組合,考慮每一個(gè)數(shù)組能夠組成的最大的位或者位數(shù)。對(duì)不同組合生成的最大數(shù)進(jìn)行比較,得到所能得到的最大的值。代碼的方法去找這個(gè)數(shù)。 LeetCode[321] Create Maximum Number Given two arrays of length m and n with digits 0-9 representing ...
閱讀 3308·2021-11-23 09:51
閱讀 2931·2021-10-28 09:33
閱讀 891·2021-10-08 10:04
閱讀 3698·2021-09-22 15:13
閱讀 1025·2019-08-30 15:55
閱讀 2915·2019-08-30 15:44
閱讀 574·2019-08-30 13:04
閱讀 2945·2019-08-30 12:56