Leetcode 402. Remove K Digits 移除元素后让剩下的数字组成的数字最小,单调栈的知识

  • 已知要移除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个数最大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值