1673. 找出最具竞争力的子序列

题目描述

在一个数组中找出长度k的子序列,使其字典序最小?

f1-单调栈

基本分析

  1. 字典序最小肯定是单调不减最好,但是怎么保证序列的长度是k?需要删除的个数是n-k,利用单调栈同时维护这个信息,超过了就不再维护有序性了。
  2. stk中最终的结果有没有可能多于k?可能的,比如本身就是单调不减,会在stk中一直加。

代码

class Solution:
def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
stk = []
n = len(nums)
last = n - k
for i in range(n):
while stk and last and stk[-1] > nums[i]:
stk.pop()
last -= 1
stk.append(nums[i])
return stk[:k]

总结

  1. 利用单调栈维护前面的单调不减的特性
  2. 利用另一个参数保证长度为k
  3. stk长度可能会超过k,注意取切片
posted @   zhangk1988  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示