【LeetCode每日一题】单调栈 402 移掉k位数字

402. 移掉 K 位数字

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

示例 1 :

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

如果有 m+1 位数字,S1

a 0 a 1 a 2 . . . . a m a_0a_1a_2....a_m a0a1a2....am

需要去掉n位数字,S2

a i , a k , , , , a n a_i,a_k,,,,a_n ai,ak,,,,an

剩余的 m+1-n 位。S3

假如用去掉的 n 位数字中的一个数字

a i ( a i < a j ) a_i (a_i < a_j) aiai<aj

替换剩余的 S3 里面的最大的字符 (a_j), 那么 新的数字会比原来的S3 要小,因此,我们用来去掉的n位数字中的每一个数字都需要大于剩余的数字

⇒ 去掉前N个最大的数字。

⇒ 通过单调栈去掉极大值,尖峰。

经过上面的分析,我们基本可以确定需要使用栈来充当这个容器了。当遍历每一个数字的时候,如果当前数字比栈顶数字大,是递增,那么就可以直接入栈,因为下一个数字有可能比当前的大;如果当前数字比栈顶的小,那么就需要将栈顶的元素弹出删除,因为这个栈顶元素既是递增的最后一个数字,也是递减的第一个数字,是一个尖峰,再删除过程中记录删除的个数或者将k - 1,当删除了所有k个数字后,就得出了结果。

遍历完毕后,k个数字没有移除完,比如数字123456789,移除3个数字,按照上面的分析,得出的结果还是123456789,出现这种情况是因为移除部分数字后,得出的结果是一个高位递增的数,所以无法再移除了,这个时候,只要出现这种情况,将低位的数字移除掉剩余个数即可,可以仔细想想这一个特殊点

var removeKdigits = function(num, k) {
   

    if(k === num.length){
   
        return "0";
    }

    let stack = [];
    for(let i = 0; i < num.length; i++){
   
        // 遇到尖峰,去掉尖峰  || 单调递减
        while(k && stack.length && stack.at(-1) > num[i]){
   
            stack.pop();
            k--;
        }
        // 维护的是一个递增的栈,但是首位不能是0
        if(!(nums[i]==="0" && stack.length === 0)){
   
            stack.push(num[i]);
        }
    }

// 移除尖峰,如果没有尖峰,就把低位的删除即可 ||单调递增
    while(k>0 && stack.length){
   
        stack.pop();
        k--;
    }

    return stack.length === 0 ? "0" : stack.join("");

};

相关推荐

  1. LeetCode每日单调 402 k数字

    2024-02-19 11:26:02       30 阅读
  2. LeetCode-402K数字

    2024-02-19 11:26:02       43 阅读
  3. leetcode 402. K 数字

    2024-02-19 11:26:02       22 阅读
  4. leetcode 402.k数字

    2024-02-19 11:26:02       16 阅读
  5. LeetCode 每日(Hard) Day 11||单调

    2024-02-19 11:26:02       34 阅读
  6. LeetCode每日单调 901股票价格跨度

    2024-02-19 11:26:02       33 阅读
  7. LeetCode每日单调316去除重复字母

    2024-02-19 11:26:02       31 阅读
  8. LeetCode 每日 Day 19 || 前后缀和分解&单调

    2024-02-19 11:26:02       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 11:26:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 11:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 11:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 11:26:02       18 阅读

热门阅读

  1. 【开源】C++ 周期任务调度的思想和实现

    2024-02-19 11:26:02       23 阅读
  2. 银行的金额大小写转换

    2024-02-19 11:26:02       32 阅读
  3. sql语句创建数据库

    2024-02-19 11:26:02       31 阅读
  4. 【c++】斐波那契数列

    2024-02-19 11:26:02       24 阅读