Leetcode.402单调栈

 

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

 
示例 1 :

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

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。
 

提示:

1 <= k <= num.length <= 105
num 仅由若干位数字(0 - 9)组成
除了 0 本身之外,num 不含任何前导零


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-k-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这是一道贪心题用单调栈来优化

思路:我们要找到一种策略使这是数字被删除k个数字后最小,就是要把所有大的并且靠前的元素删除。

class Solution {
public:
    string removeKdigits(string num, int k) {
        string stk; 
        string ans;
        if(num.size() == k) return "0";
    
        for(int i = 0; i < num.size(); i ++)
        {
            while(stk.size() && num[i] < stk.back() && k)
            {
                stk.pop_back();
                k --;
            }
            stk.push_back(num[i]);
        }
        while (stk.size() && k > 0)
        {
            stk.pop_back(); 
            k--;
        }
        for(auto x : stk)
        {
            if(ans.size() == 0 && x == '0') continue;
            ans += x;
        }
        if(ans.size() == 0) ans += "0";
        return ans;
    }
};

几点细节要注意

1.可能只删除了m个元素栈中所有数都单调了,这时候我们需要在栈顶删除k - m个数

2.前导零如何处理

这里我们可以把string当成栈

 

前导零的处理 

for(auto x : stk)
        {
            if(ans.size() == 0 && x == '0') continue;
            ans += x;
        }
        if(ans.size() == 0) ans += "0";

 

posted @   cxy8  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示