402.移掉 K 位数字
【LetMeFly】402.移掉 K 位数字
力扣题目链接:https://leetcode.cn/problems/remove-k-digits/
给你一个以字符串表示的非负整数 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
不含任何前导零
方法一:单调栈
这道题的核心是“让前面的数字尽可能小”
因此我们可以使用单调栈,遍历一遍字符串,当栈顶数字比当前数字大时,栈顶元素出栈(前提是还有“删除次数”,也就是说k大于0)。然后将当前元素入栈。
这样,越靠近栈底的元素就越小。
如果“删除次数k”还有剩余,那么就从栈顶开始出栈,直到“删除次数”用完
之后将栈顶元素弹出来,加入字符串中。
因为栈中是“后入先出”的,所以我们还需要把字符串反转一下。
之后,删除前导零(如果字符串删空了就返回“0”)
力扣官解的动图不错,可以方便理解这个算法,特推荐一波。
- 时间复杂度$O(n)$
- 空间复杂度$O(n)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127332829
402.移掉 K 位数字
https://blog.letmefly.xyz/2022/10/15/LeetCode 0402.移掉K位数字/