- 已知要移除k个数,假设共有n个数,那么最后会保留n-k个数
- 核心思想就是要保留一个序列,不断将新的数字放进去,让这个序列组成的数字越小越好。想一想,应该是前面的高位的数字,越小越好,后面大一点问题到不大。最终呈现出来的效果就是一个单调的非递减的序列,即一个单调栈结构,有点像next greater element
- 怎样让它尽可能小呢?
- 显然新的数字如果比当前序列中的还要小,那么就可以把它放进来,比它小的清除掉。
- 另外,由于有清除元素数量为k的限制,那么这个操作也是有限的
- 单调栈就是每次入栈前,先依次和里面的元素比较,假设维护一个单调递增的栈,那么就不断把比它大的栈顶元素清除,随后再入栈。
class Solution {
public:
string removeKdigits(string num, int k) {
stack<char> s;
int count=0;
if(k>=num.size()) return "0";
for(int i=0; i<num.size(); i++){
while(!s.empty() && num[i]<s.top() && count<k){
s.pop();
count++;
}
s.push(num[i]);
}
while(count<k){
s.pop();
count++;
}
string res;
while(!s.empty()){
res.insert(0, 1, s.top());
s.pop();
}
while(res[0]=='0' && res.size()>1){
res.erase(0,1);
}
return res;
}
};
- 这道题的变种也是Google的原题,比如让你从string中取出k个数让剩下的结果最大/让这k个数最大