摘要:當我們用盡了所有刪除時,就保留后面所有的數字,不再進行任何比較。因為我們已經盡可能獲得了最小的最高位,因此無論后面的數字如何取值,其最高位上的數字一定是可以獲得的最小的這個數字。
題目要求
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.
假設現在有一個用字符串表示的非負的整數,問從中刪除掉k個數字后能夠得到的最小結果是多少?
思路和代碼直觀的來說,刪除數字得到最小的數字意味著我們應當盡可能的將越小的數字保留在高位,因此當我們從左往右遍歷時,一旦遇到比前一個數字更小的數字,就應當刪除前一個數字而保留這個數字。當我們用盡了所有刪除時,就保留后面所有的數字,不再進行任何比較。因為我們已經盡可能獲得了最小的最高位,因此無論后面的數字如何取值,其最高位上的數字一定是可以獲得的最小的這個數字。舉個例子:
10200 k=1 第一步: 0和1比較,此時0比1小,且還有一次可用的刪除,因此刪除1,保留0 第二步:因為無可用的刪除次數,因此剩下的值全部保留 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 第十步: 此時所有的刪除次數用完,因此剩余的值全部保留
可以看到,當我們遇到較小值時,我們會盡可能的將其往左邊移動,因為只要它比左邊的值小且剩余刪除次數,則刪除左邊的值一定會得到一個更小的值。
代碼如下:
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(); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73610.html
摘要:題目鏈接根據題目的描述,移掉個數字然后得到最小值,肯定是。后面的和需要移掉也是同理。用個來保存之前遞增的數字。注意這個例子,去掉之后,最高位是,也得去掉。 402. Remove K Digits 題目鏈接:https://leetcode.com/problems... 根據題目的描述,移掉k個數字然后得到最小值,肯定是greedy。那么greedy的feature是什么呢?看例子,...
摘要:每個字母只留一個,而且保證字典序最小。從前往后掃描,還要往前看一個檢出是否刪除的,要用解。需要一個數據結構記錄是否使用這個字母,可以用。結構也可以用數組加頂點指針模擬。 316 Remove Duplicate Given a string which contains only lowercase letters, remove duplicate letters so that e...
摘要:此模型的特殊性相鄰的三個值可以得到一個爆破值,相鄰的兩個值相當于沒有值,賦予類比二分法求極值。通過二分確定具體的位置。此處二分法到極值是三個連續的數,從相鄰三個數的固定值,逐次放寬范圍,確定越來越寬的爆破值。 此題的總結: 求解 最大爆破值, 是一個 倒序 二分法問題,最終的原子結構是連續的三個數。連續的三個數,可以 往上遞推 間隔一個數的三個數,間隔n個數的三個數特點在于:每一...
摘要:算法復雜度思路貪心算法,先能組成的數的組合,然后針對每一個組合,考慮每一個數組能夠組成的最大的位或者位數。對不同組合生成的最大數進行比較,得到所能得到的最大的值。代碼的方法去找這個數。 LeetCode[321] Create Maximum Number Given two arrays of length m and n with digits 0-9 representing ...
閱讀 3300·2021-11-23 09:51
閱讀 2911·2021-10-28 09:33
閱讀 875·2021-10-08 10:04
閱讀 3682·2021-09-22 15:13
閱讀 1016·2019-08-30 15:55
閱讀 2906·2019-08-30 15:44
閱讀 564·2019-08-30 13:04
閱讀 2938·2019-08-30 12:56