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

动态规划与二分法破解最长递增子序列

LeetCode300

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

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

Python解法

1.动态规划

class Solution: def lengthOfLIS(self, nums: List[int]) -> int: if len(nums) == 0: return 0 dp = [1] * len(nums) for i in range(len(nums)): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1) return max(dp)

2.贪心+二分

class Solution: def lengthOfLIS(self, nums: List[int]) -> int: d = [] for num in nums: # 直接二分查找第一个 >= num 的位置 left, right = 0, len(d) while left < right: mid = (left + right) // 2 if d[mid] >= num: right = mid else: left = mid + 1 # left就是要替换的下标 if left == len(d): d.append(num) else: d[left] = num return len(d)

Java解法

1.动态规划

class Solution { public int lengthOfLIS(int[] nums) { if(nums.length == 0) return 0; int[] dp = new int[nums.length]; for(int i = 0; i < nums.length; i++){ dp[i] = 1; } int res = 1; for(int i = 0; i < nums.length; i++){ for(int j = 0; j < i; j++){ if(nums[i] > nums[j]){ dp[i] = Math.max(dp[i], dp[j] + 1); } } res = Math.max(res, dp[i]); } return res; } }

2.贪心+二分

class Solution { public int lengthOfLIS(int[] nums) { int[] d = new int[nums.length]; int len = 0; for (int num : nums) { int left = 0, right = len; while (left < right) { int mid = (left + right) / 2; if (d[mid] >= num) { right = mid; } else { left = mid + 1; } } if (left == len) { d[len++] = num; } else { d[left] = num; } } return len; } }

C++解法

1.动态规划

class Solution { public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); if(n == 0)return 0; vector<int> dp(n, 1); // 初始化dp数组,所有元素初始值为1 for (int i = 0; i < n; ++i) { // 遍历i之前所有元素 j ∈ [0, i-1] for (int j = 0; j < i; ++j) { if (nums[i] > nums[j]) { dp[i] = max(dp[i], dp[j] + 1); } } } // 返回dp数组最大值 return *max_element(dp.begin(), dp.end()); } };

2.贪心+二分

class Solution { public: int lengthOfLIS(vector<int>& nums) { vector<int> d; for (int num : nums) { int left = 0, right = d.size(); while (left < right) { int mid = (left + right) / 2; if (d[mid] >= num) { right = mid; } else { left = mid + 1; } } if (left == d.size()) { d.push_back(num); } else { d[left] = num; } } return d.size(); } };

一、动态规划 DP

原理

  1. 拆分成小问题,存下每个小问题的最优解,避免重复计算;
  2. 靠前面结果推出当前结果,满足:最优子结构、重叠子问题、无后效性。

LIS 里的表现

dp[i]:以第 i 个数结尾的最长递增子序列长度,逐个对比前面所有数字更新。

复杂度

\(O(n^2)\)

适合题目

  1. 数据量小(n≤1000);
  2. 需要输出完整子序列、统计有多少条最长序列;
  3. 背包、最长公共子序列 LCS、打家劫舍、股票问题(贪心做不了)。

二、贪心 + 二分(LIS 优化版)

原理

  1. 贪心:相同长度的递增子序列,末尾数字越小,后续越好接更大数字;
  2. 二分:快速找到要替换的位置,把时间压到对数级。

LIS 里的表现

数组 d:d [k] 代表长度 k+1 的序列最小末尾值,新数字要么加长序列,要么替换旧末尾。

复杂度

\(O(n\log n)\)

适合题目

  1. 数据量大(n 上万 / 十万);
  2. 只需要求最长序列长度,不需要路径、计数;
  3. 导弹拦截、俄罗斯套娃信封。

极简区分

  • DP:万能,能计数 / 找路径,慢,小数组用;
  • 贪心二分:只算长度,速度极快,大数据专用。
http://www.jsqmd.com/news/1177366/

相关文章:

  • 2026年7月编程语言排行榜|Rust 首进前十创历史
  • 2026年7月最新浪琴南京龙湖麒麟天街维修保养服务电话 - 浪琴官方售后服务中心
  • PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
  • S16.6第一性原理做产品(6·收官):从《定位》到“品类设计“——AI时代如何定义新品类
  • UML 2.5 实战:从10个核心图例到代码生成,提升团队设计效率50%
  • 影刀RPA 动态加载网页的稳定采集三策略
  • 2026宁波园区高新技术企业申报机构选择参考指南 - 起跑123
  • 2026年7月最新哈尔滨宇舶官方售后联系电话与客户服务中心网点地址 - 亨得利官方服务中心
  • Python财务数据清洗:量化投资中时间点处理与TTM计算实践
  • 2026 怎么判别宁波本地洁净工程公司的施工质量 - 起跑123
  • 2026年7月最新长沙封窗主流品牌全景梳理参考 - 起跑123
  • 2026最新六盘水本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水
  • 2026年7月口碑好的宁波挑选新房精装设计公司有哪些实用技巧 - 起跑123
  • 美国队长三部曲:从体制符号到个人信念的逆向成长
  • 家庭装修时如何选购开关插座面板?
  • 亲身探访深圳欧米茄官方售后服务中心|全部网点地址与热线(2026年7月最新) - 欧米茄官方服务中心
  • 2026宠物竹鸡养殖基地有哪些 主流场地中立实测评测 - 起跑123
  • 屏障受损肌面膜哪家靠谱:蜜妙诗匠心专研 - MXyuyu
  • 2026创作者工具优选:6款长视频去水印小程序深度横评,合规免费无损工具首选白虎神器99.6高分登顶 - 互联网科技品牌测评
  • Java周刊2026W28 | Spring Boot 4.1、IntelliJ IDEA 2026.2、Jackson 7漏洞、ZGC十年回顾、Endive 1.0
  • python interpreter Python的GIL锁死你多线程?CPU密集任务跑得比单线程还慢,气炸了
  • 影刀RPA 医药行业自动化:药品信息采集与价格监控
  • Android Camera MIPI接口知识总结
  • [Django+深度学习]毕业设计:基于深度学习的酒店评论文本情感分析系统(全套源码+论文+PPT+视频)
  • 2026年7月最新佛山百达翡丽官方售后客户服务电话及线下网点地址 - 百达翡丽官方售后中心
  • 四款长视频无损去水印小程序实测 核心维度对比解析 - 互联网科技品牌测评
  • 2026年7月口碑好的宁波靠谱的新房精装设计公司哪家好 - 起跑123
  • Python后端开发秘籍大公开,客户端程序编写超震撼
  • 2026年亲测教程:手机上 PDF 怎么转成图片最省事 - 图片处理研究员
  • QuakeIV 多人def