📅  最后修改于: 2023-12-03 15:42:24.283000             🧑  作者: Mango
给定一个非负整数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)。