LeetCode力扣402题:移掉k位数字————贪心+单调栈

题目描述:

        给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

        

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。


解析:本题可采用贪心+单调栈的方法进行解决。

           我们知道,一个多位数字越左边的数越小,则该数越小,例如:1234<1134 , 3123<2123。

           因此对于这道题目,我们只需要保证左边的数字较小,就可以确保最后的答案是最小的,靠右数字的大小,对本题的答案没有影响。

           对于每次执行,我们要确保删除一个靠左的、较大的数字。我们可以构造一个单调栈,让每一位数字A都进入栈,并且与栈顶的数字进行比较,如果A比栈顶数字更小,那么弹出栈顶数字,重复进行上述操作,直至栈顶数字小于等于A或栈顶为空或弹出数字的数量达到了最大值K。

            对所有数字进行以上操作后,我们已经可以确保靠左边的数字为最优解,如果此时删去数字的数量还未达到K,则删去末尾的数字,直至数量满足要求。

代码:

class Solution {
public:
    
    string removeKdigits(string num, int k) {
        vector<char> ans;
        for(auto& digit: num){
            while(ans.size()>0&&ans.back()>digit&&k){
                ans.pop_back();
                k-=1;
            }
            ans.push_back(digit);
        }
        for(;k>0;--k){
            ans.pop_back();
        }
        string t="";
        bool iszero=true;
        for(auto& digit: ans){
            if(iszero&&digit=='0'){
                continue;
            }
            iszero=false;
            t+=digit;
        }

        return t == "" ? "0" : t;
    }
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值