Remove K digits
此题必须要看出一个规律,即当前数字大于下一个数字时,则如果k为1,我们肯定是要丢掉现在这个数字才能形成最小数的,举个🌰,1432219如果只能删除一位数字构成最小数,则我们要选的是4,因为4是第一个出现数值下降的位置,根据这个我们就可以发现,如果可以删除k位,则我们要进行这样的操作k次,而实际上我们并不需要暴力的执行k次,而是可以通过单调栈来实现这一点,这个就比较容易看出来了,每次出现数值下降就一直弹出栈内元素并降低k值,最后栈中剩下来的数字就是我们需要的最后组合的最小数字,这里有一些边际情况需要额外处理,如数字一直递增或栈内没有数字了
class Solution(object):
def removeKdigits(self, num, k):
"""
:type num: str
:type k: int
:rtype: str
"""
stack = []
for char in num:
while stack and k and stack[-1] > char:
stack.pop()
k -= 1
stack.append(char)
while k:
stack.pop()
k -= 1
return str(int(''.join(stack))) if stack else '0'