贪心的策略,每次删除一个数使得剩余数组成的数字最小。于是就从前往后找第一个i
使得nums[i]>nums[j]
,删除该元素。重复该过程直至删除够k
个元素,或者找不到这样的元素。但这种方法在最坏情况下的时间复杂度会达到O(n*k)
,如序列[1,2,3,...,100,99,98,..1,]
问题也可以从另一个角度来想:如果一个元素比它前面的元素小,我们就把它往前推一个(也就是删除前一个元素)直至它前面没有元素或者前面的元素比它小或者已经删除了k
个。如果有多个满足条件的元素怎么办呢?由于两个相同位数的数字大小关系取决于第一个不同的数的大小,所以我们总是考虑第一个满足条件的元素。
再换一种想法就是用一个栈保存局部最优序列,每次用一个元素更新局部最优序列。
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
if len(num)==k:
return '0'
n = len(num)
res = []
for i in range(n):
while res and k>0 and num[i]<res[-1]:
res.pop()
k-=1
res.append(num[i])
if set(res) == {'0'}:
return '0'
elif k==0:
return ''.join(res).lstrip('0')
else:
return ''.join(res[:-k]).lstrip('0')