题目描述
给了一个字符串百奥是的非负整数num和整数k,问怎么移除其中的k个数字,让剩下的数字最小?
f1-单调栈 |
基本分析
- 怎样的数字是最小的?单调递增排序的
- 带有约束k怎么考虑?只要栈非空+栈顶>d+ 还有k就能一直删
- k没用完怎么办?字符是单调增的,从后往前删k次(k被维护过)
- 结果怎么得到?栈中元素合成字符串,注意前导0和""情况
代码
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
st = []
for i, d in enumerate(num):
while st and k and st[-1] > d:
st.pop()
k -= 1
st.append(d)
for _ in range(k):
if st:
st.pop()
# 注意k没用完的情况
ans = "".join(st).lstrip('0')
if ans != "":
return ans
else:
return "0"
总结
- 这里的栈放的就是最终的结果,是非严格递增,到了删除的情况时,如果k允许就删,删够了后面就无脑加。头部比屁股重要。