当前位置: 首页 > news >正文

动态规划题解——最长递增子序列【LeetCode】记忆化搜索方法

300. 最长递增子序列


一、算法逻辑(逐步思路)

❓ 问题描述:

给定一个整数数组 nums,找出其中最长严格递增子序列的长度。


✅ 解题思路(DFS + 记忆化)

1. 定义递归函数:
dfs(i) 表示:以 nums[i] 为结尾的最长递增子序列的长度
2. 转移逻辑:
  • 对于位置 i,你要去找 0~i-1 所有小于 nums[i] 的前缀 j
  • 对每个满足 nums[j] < nums[i] 的位置 j
    • 当前以 nums[i] 为结尾的序列长度可以是:dfs(j) + 1
    • 所以取其中的最大值。
3. 递归基:
  • dfs(i) 至少为 1,因为每个元素自身就是一个长度为 1 的递增子序列。
4. 最终答案:
  • 所有 dfs(i) 中的最大值,即 max(dfs(i) for i in range(n))
5. 使用 @cache 做记忆化,避免重复递归计算。

二、算法核心点

✅ 核心思想:“以 i 结尾”模型 + 记忆化 DFS

  • 每一个位置都试图作为“递增序列的终点”,寻找它前面的合法子结构;
  • 这是 LIS 问题的经典思维方式(不同于“以 i 开头”的方式);
  • 记忆化可以有效避免指数级递归爆炸。
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:@cachedef dfs(i:int)-> int:res = 0for j in range(i):if nums[j] < nums[i]:res = max(res, dfs(j))return res+1return max(dfs(i) for i in range(len(nums)))

三、复杂度分析

  • 时间复杂度:O(n²)
    • 一共 n 个位置;
    • 每个 dfs(i) 至多遍历前 i 个位置(最多 n 次);
    • 加上缓存,每个状态只算一次。
  • 空间复杂度:O(n)
    • 缓存表大小为 n
    • 递归栈最大深度为 n

总结表:

维度

内容

✅ 思路逻辑

每个位置向前查找比它小的数,递归求以该位置为结尾的 LIS 长度

✅ 核心技巧

转化为“以 i 结尾”的子问题;记忆化避免重复递归

✅ 时间复杂度

O(n²),两层循环(递归 + 遍历前缀)

✅ 空间复杂度

O(n),记忆表和递归栈大小


💡 拓展建议

  • 如果你想进一步优化时间到 O(n log n),可以使用贪心 + 二分法的经典 LIS 做法(如使用 bisect 插入维护当前最小末尾值序列);
  • DFS 写法适合初步掌握问题结构,DP/贪心更适合大数据场景。
http://www.lryc.cn/news/587994.html

相关文章:

  • 掉线监测-tezos rpc不能用,改为残疾网页监测
  • urlencode、html实体编码、unicode
  • 认识下计算机视觉中的人脸识别
  • React强大且灵活hooks库——ahooks入门实践之DOM类hook(dom)详解
  • C++-linux 5.gdb调试工具
  • LSY_C语言编程题
  • AI数据分析仪设计原理图:RapidIO信号接入 平板AI数据分析仪
  • Markdown表格列格式(加粗 / 高亮 / 复选 / 进度条 / 数值 / 货币 /…)~优雅好用的 Typora 主题与增强插件 VLOOK™
  • MFC中BOOL类型,在某些操作系统中,-1不能被识别,一般是哪些原因?
  • NAT原理与实验指南:网络地址转换技术解析与实践
  • com2tcp工具
  • 使用axios向服务器请求信息并渲染页面
  • DVWA靶场通关笔记-存储型XSS(Stored Medium级别)
  • TCP心跳机制详解
  • 多客户端-服务器(select,poll)
  • 多客户端 - 服务器结构-实操
  • 如何在服务器上运行一个github项目
  • Rsyslog介绍及运用
  • 面试150 二叉树中的最大路径和
  • 26-计组-多处理器
  • K8S的平台核心架构思想[面向抽象编程]
  • 自动驾驶数据仓库:时间片合并算法。
  • ether.js—6—contractFactory以部署ERC20代币标准为例子
  • 0201-solidity基础-区块链-web3
  • OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战
  • 虚拟货币交易:游走在合法与犯罪的生死线
  • 排序树与无序树:数据结构中的有序性探秘
  • 【【异世界历险之数据结构世界(二叉树)】】
  • 交换类排序的C语言实现
  • 删除当前项目关联的远程仓库(remote)