贪心算法-递增的三页子序列

题目链接

一、问题描述

给定一个整数数组 nums,判断是否存在长度为3的递增子序列 ,即是否存在下标 i < j < k,使得 nums[i] < nums[j] < nums[k]。

  • 存在则返回 true,否则返回 false。

二、核心解法

解法1:动态规划(DP)
  • 思路:计算数组的**最长递增子序列(LIS)**的长度,若长度 ≥ 3,则说明存在符合要求的子序列。
  • 实现逻辑 :
    1. 定义 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。
    2. 对每个 i,遍历所有 j < i,若 nums[j] < nums[i],则 dp[i] = max(dp[i], dp[j] + 1)。
    3. 遍历 dp 数组,若存在值 ≥ 3,直接返回 true。
  • 复杂度 :时间复杂度 O(n²),空间复杂度 O(n)(需存储 dp 数组)。
解法2:贪心算法
  • 思路 :用两个变量 a、b 分别记录长度为1 和长度为2 的递增子序列的最小末尾值 ,遍历数组时更新这两个变量,一旦找到比 b 大的元素,说明存在长度为3的递增子序列。
  • 实现逻辑 (以示例 [2,1,5,0,4,6] 为例):
    1. 初始化 a = ∞,b = ∞。
    2. 遍历每个元素 x:
      • 若 x ≤ a → 更新 a = x(保持长度1的子序列末尾最小);
      • 若 a < x ≤ b → 更新 b = x(保持长度2的子序列末尾最小);
      • 若 x > b → 说明存在 a < b < x,即长度为3的递增子序列,直接返回 true。
    3. 遍历结束未找到则返回 false。
  • 复杂度 :时间复杂度 O(n)(仅需一次遍历),空间复杂度 O(1)(仅用两个变量),是更优的解法。

三、知识点总结

  1. 问题本质:该问题是「最长递增子序列(LIS)」的特例,只需判断 LIS 长度是否 ≥ 3。
  2. 算法对比 :
    • 动态规划适用于需要完整计算 LIS 长度的场景,但时间复杂度较高;
    • 贪心解法针对「判断是否存在长度为3的递增子序列」做了优化,时间、空间效率更优。
  3. 贪心策略的核心:维护最小的可能末尾值,让后续更容易找到更长的递增子序列,从而提升效率。
相关推荐
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi8 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院10 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng10 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~13 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py14 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing14 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客14 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法