402. 移掉 K 位数字
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
题解
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
# 剪枝
if len(num) == k:
return '0'
# 单调栈 从左到右入栈
stack = []
for i in num:
if k == 0:
stack.append(i)
continue
if len(stack) == 0:
stack.append(i)
else:
while len(stack) > 0 and i < stack[-1] and k > 0:
if i < stack[-1]:
stack.pop()
k -= 1
else:
stack.append(i)
# 要删除的数量为满足,因为栈是单调递增的,所以大的元素在后面,从栈顶删就好了
while k > 0:
stack.pop()
k -= 1
# 去除前导“0”的影响
start = 0
for i in stack:
if i == '0':
start += 1
else:
break
# 组合答案
res = ''.join(stack[start:])
if len(res) == 0:
res = '0'
return res
思路
贪心的策略,如果大的数在高位则删除。使用单调栈保证栈中后入的元素始终是大于等于先入的元素,在完成所有数字的入栈操作后,删除的元素个数还是小于k,则将低位上的较大的数字删除,以此保证剩余数字组成的数最小。