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'

results matching ""

    No results matching ""