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

LeetCode 300 | 最长递增子序列

题目
给你一个整数数组 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 = [7,7,7,7,7,7,7]
输出:1

✨方法一:动态规划
这是常规的动态规划题目,dp[i]表示以nums[i]为结尾的严格递增子序列长度。
如何转移?
当下标 j 满足 j < i,并且 nums[j] < nums[i],此时可以将数字nums[i]接在dp[j]所表示的严格递增子序列后面,此时序列长度加一。
如何保证dp[i]为最长子序列的长度?
遍历j选择满足条件的dp[j]最大的j,此时dp[i]也最大。

转移方程为:
dp[i] = max(dp[j]) + 1, 其中 0 ≤ j < i 且 num[j] < num[i]

选择整个数组的最长严格递增子序列的长度,需要遍历找dp[i]的最大值。

🔑完整代码:

int lengthOfLIS(vector<int>& nums) {int n = nums.size(), ans = 1;vector <int> dp(n + 1, 1);dp[0] = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;}ans = max(ans, dp[i]);}return ans;}

✨方法二:贪心算法+二分查找
在选择数字组成严格递增子序列时,前面的数字越小,有机会组成最长子序列的可能性越大。

我们遍历数组时,将数字nums[i]接在已得到的严格递增序列v中,v的长度为len。
如果当前数字大于目前序列的最后一位 v[len - 1] :直接添加在后面即可。
v[len++] = nums[i];
如果小于:
我们寻找‘它可以接在哪’,即寻找第一位比它大的数字v[t],并替代该数字。因为对于后面的数字来说,可以接在v[t]后面就一定可以接在当前数字nums[i]后面。
此时,我们能够同时保留原序列和新序列,对于原最长序列,len就是它的长度,并且可以继续往后延续。
我们可以通过二分查找寻找第一位比它大的数字v[t]。

🔑完整代码:

int lengthOfLIS(vector<int>& nums) {int n = nums.size(), len = 0;vector <int> v(n + 1);for(int i = 0; i < n; i++){if(len == 0 || v[len - 1] < nums[i]){v[len++] = nums[i];continue;}if(v[0] >= nums[i]){v[0] = nums[i];continue;}int l = 0, r = len - 1, mid;bool flag = true;while(l + 1 < r){mid = (l + r) / 2;if(v[mid] == nums[i]){flag = false;break;}if(v[mid] < nums[i]) l = mid;else r = mid;}if(flag)  v[r] = nums[i];}
http://www.jsqmd.com/news/481778/

相关文章:

  • python_01
  • 交换分区的添加
  • 一个flag劈三瓣儿
  • 2026年必学大模型!掌握这个技能,薪资飙升65%!从零基础到精通,完整学习路线图在此
  • 用 JSON 列存储扩展字段后,如何优雅地支持高频查询?MySQL 虚拟列 + 联合索引实战指南
  • GESP六级
  • 安装ant design pro V6相关依赖和react版本冲突报错,umi和node版本冲突
  • 5本自学大模型的入门书籍,从入门到精通,都在这里了!
  • TCP close 过程分析 - liyan
  • 用实力说话千笔,多场景适配降重神器 —— 千笔
  • AReaL: A Large-Scale Asynchronous Reinforcement Learning System for Language Reasoning
  • bpftrace 无侵入遍历golang链表 - liyan
  • 恒企专修学院电话查询:选择培训机构的风险提示 - 品牌推荐
  • 导师推荐 8个降AIGC工具:多场景适配+降AI率全测评
  • 大模型开发入门到进阶:从入门到实战,4阶段完整路径,带你掌握大模型开发!
  • 30天硬核!从0到精通大模型开发,高薪风口等你来抓!
  • 毕业论文神器 9个AI论文网站深度测评:本科生开题报告与学术写作必备工具
  • bpftrace 遍历 golang 链表(go17+) - liyan
  • c++插件管理--pluma实践 - liyan
  • 四周速成!从零掌握AI大模型,内含实战项目与学习计划_30天大模型开发速成
  • 09 部署与成本控制:Serverless 架构下 Agent 的 Token 优化艺术
  • 老王-城府不是心机而是清醒的边界感
  • BPF 获取 LVS FullNat 模式下的 Client IP - liyan
  • 解决RDK X5(ARM64架构)板卡Remote-SSH运行Antigravity AI崩溃(SIGILL):Samba网络盘本地挂载方案
  • 强烈安利! AI论文工具,千笔AI VS 灵感风暴AI,专科生必备神器!
  • centos 安装docker并构建golang镜像 - liyan
  • 狡猾的北狐狸
  • 老王-三观稳则人生稳
  • centos 构建 local-k8s - liyan
  • 老王-老祖宗没说完的后半句