LeetCode 1673.找出最具竞争力的子序列(单调栈)

题目

思路

  这道题的题干是和子序列相关的,并且最后要求出同等长度的子序列中字典序最小的情况。考虑借用栈这种数据结构,栈中储存当前的一个可行解。遍历字符串,如果遇到当前字符比栈顶字符字典序小的情况,就尽量多得从栈中弹出原有元素,最后再将该元素加入。不过这里 有两个细节需要考虑,一是如果当前栈中元素个数还未达到k值,则即使没有元素出栈,当前元素也应该入栈;二是出栈的时候需要考虑剩下元素与栈中还需要填充元素个数的关系,如果剩下的元素个数只够刚好填充栈使栈中元素达到k值的话,那么此时就不能再弹出元素,否则最后无法满足题意。

代码

 

class Solution:
    def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
        q=[]
        n=len(nums)
        if n==1:
            return nums
        q.append(nums[0])
        for i in range(1,n):
            flag=0
            while q and nums[i]<q[-1]:
                flag=1
                if k-len(q)==n-i: #检验剩下的元素个数与栈中需要填充元素个数的关系
                    break
                q.pop()
            if flag:
                q.append(nums[i])
            elif not flag and  len(q)<k:
                q.append(nums[i])
        return q

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值