第9章|动态规划

Unit 10 · LeetCode #300 最长递增子序列

← Unit 09
仅本次页面有效
U10
Longest Increasing SubsequenceEnding State · Predecessor Scan

不是“前缀里最好”,
而是“必须在这里结束”。

最大子数组和已经展示过局部状态与全局答案的分离。本单元把这种思想迁移到非连续选择:dp[i] 不表示前缀整体最优,而表示必须以 nums[i] 结尾的最长严格递增子序列长度。

已恢复上次学习位置阶段、动画、答题、代码槽位和迁移进度均已恢复。
知识桥梁|Unit 09 → Unit 10
Unit 09:坐标决定前驱

网格中的当前格只能从上方或左方到达,前驱结构由空间位置固定。

固定前驱 → 扫描全部左侧
Unit 10:数值决定前驱

索引 j 只有同时满足 j < i 与 nums[j] < nums[i],才可连接到当前结尾。

本单元贯穿问题当前状态必须以哪个元素结尾?哪些左侧位置可以成为合法前驱?最终答案为什么可能不在最后一个状态?
LeetCode #300 原题题面转述、示例、约束与提交签名

题目要求

给定整数数组 nums,返回其中最长严格递增子序列的长度。子序列可以删除若干元素,但保留下来的元素必须维持原数组中的相对顺序;它不要求连续。

from typing import List class Solution: def lengthOfLIS(self, nums: List[int]) -> int: pass

约束

  • 1 ≤ nums.length ≤ 2500
  • -10⁴ ≤ nums[i] ≤ 10⁴
  • 严格递增使用 <,相等元素不能连接。

示例

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
一种最长递增子序列:[2,3,7,101]
输入:nums = [0,1,0,3,2,3]
输出:4
输入:nums = [7,7,7,7,7,7,7]
输出:1

主方法

本页主动画采用 O(n²) 动态规划,以完整呈现状态语义和前驱关系;进阶的贪心+二分可达到 O(n log n)。

方法时间空间本章用途
枚举全部子序列O(2ⁿ)O(n)看见组合爆炸
以结尾位置为状态的 DPO(n²)O(n)主教学方法,可解释前驱与方案数量
贪心+二分 tailsO(n log n)O(n)进阶优化;tails 不一定是一条真实 LIS
六段主流程
本环节已完成

请停留观察当前状态,确认你能解释高亮状态的含义。

1 / 6