402. Remove K Digits
题目链接:https://leetcode.com/problems...
根据题目的描述,移掉k个数字然后得到最小值,肯定是greedy。那么greedy的feature是什么呢?
看例子,首先是1432219,k = 3,不去掉1的原因是后面接的是4,当前这一步,看到下一个数比自己大的时候移掉是不划算的,因为移掉这个数之后最高位变成4,是不如保留1小的。所以可以看出规律实际上是从msb开始只要发现比之前有比当前位大的数字,那肯定要移掉之前的数字,这样当前最高位的数字就变小了。后面的3和2需要移掉也是同理。用个Stack来保存之前递增的数字。
再看1223,k = 1, 从左往右扫一遍发现没有出现nums[i-1] > nums[i]的情况,所以第一次扫的时候删了0个,这时候就从最大值开始移。
注意10200这个例子,去掉1之后,最高位是0,也得去掉。
public class Solution {
public String removeKdigits(String num, int k) {
StringBuilder sb = new StringBuilder();
int n = num.length();
char[] stack = new char[n];
int count = 0;
// remove the digit that larger than digit after it
for(int i = 0; i < n; i++) {
while(count != 0 && k > 0 && num.charAt(i) < stack[count-1]) {
count--;
k--;
}
stack[count++] = num.charAt(i);
}
// remove 0 at the beginning
int start = 0;
while(start < count && stack[start] == '0') start++;
// remove from lsb
return start >= count - k ? "0" : new String(stack, start, count - start - k);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。