📌  相关文章
📜  除去K位后可能的最大数字(1)

📅  最后修改于: 2023-12-03 15:42:24.283000             🧑  作者: Mango

除去K位后可能的最大数字

给定一个非负整数num和一个整数k,移除该数字中的k个数字,使结果是可能的最大数字。

示例1:

输入:num = "1432219", k = 3
输出:"3219"
解释:移除数字4、3和2,得到可能的最大数字3219。

示例2:

输入:num = "10200", k = 1
输出:"200"
解释:移除数字1,得到可能的最大数字200。注意输出不能有前导零。

示例3:

输入:num = "10", k = 2
输出:"0"
解释:移除数字1和0,得到可能的最大数字0。注意输出不能有前导零。
解题思路

观察题目可以发现,要把原数字变成一个可能的最大数字,首先需要确保较高位的数字是最大的。

可以使用单调栈来解决此问题。

从左到右遍历每一位数字,如果当前数字小于栈顶数字,则将栈顶数字出栈,直到当前数字大于等于栈顶数字或者已经移除k个数字。

这样可以确保栈中的数字始终是单调递减的,同时也保证了删除数字的数量,接着将剩余数字和栈中的数字组合,得到可能的最大数字。

需要注意的是当已经删除了k个数字并且栈中还有剩余数字时,需要将栈中的所有数字弹出。

同时还要考虑特殊情况,当剩余数字全部相同时,需要保留前n-k个数字,其中n为原数字长度。

代码实现
class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        stack = []
        for i in range(len(num)):
            while k and stack and num[i] < stack[-1]:
                stack.pop()
                k -= 1
            stack.append(num[i])
        if k:
            stack = stack[:-k]
        while stack and stack[0] == '0':
            stack.pop(0)
        return "".join(stack) if stack else "0"
时间复杂度

时间复杂度为O(n),其中n为原数字长度。

空间复杂度

使用了一个栈,空间复杂度为O(n)。

参考链接

LeetCode #402 Remove K Digits