使用stack,保持stack的最后一位小于遍历到的新数字,且在此时保持stack里有数字数目加上目前还未遍历到的数字数量不小于k。反过来,则将stack中的数字弹出。注意,一定在栈内数字量和未遍历到数字量加大于k的前提下,且栈顶的数字大于遍历到的数字的前提下持续弹出。以此保证较小数字出现在较前位置。
class Solution:
def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
stack = []
n = len(nums)
i = 0
while i < n:
while stack and stack[-1] > nums[i] and n - i + len(stack) > k:
stack.pop()
if len(stack) < k:
stack.append(nums[i])
i += 1
return stack