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

「动态规划」如何求最长递增子序列的长度?

300. 最长递增子序列icon-default.png?t=N7T8https://leetcode.cn/problems/longest-increasing-subsequence/description/

给你一个整数数组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。
  3. 输入:nums = [7,7,7,7,7,7,7],输出:1。

提示:1 <= nums.length <= 2500,-10^4 <= nums[i] <= 10^4。

进阶:你能将算法的时间复杂度降低到O(nlog(n))吗?


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i]表示:以i位置为结尾的所有子序列中,最长递增子序列的长度

推导状态转移方程:以i位置为结尾的所有子序列分为2类:长度为1的子序列,长度大于1的子序列。如果子序列的长度是1,那么这个子序列是递增子序列。下面我们考虑长度大于1的子序列。

如果以i位置为结尾的子序列的长度大于1,我们可以继续细分为:i位置元素的前面是i - 1位置元素的子序列,i位置元素的前面是i - 2位置元素的子序列,i位置元素的前面是i - 3位置元素的子序列,……,i位置元素的前面是0位置元素的子序列。也就是说,如果子序列中,i位置元素的前面是j位置元素,那么j的范围是[0, i - 1]。

对于每一个j,如果nums[j] < nums[i],那么这个子序列就有可能是递增子序列。要想这个子序列尽可能得长,就要找到以j位置为结尾的最长递增子序列,在这个子序列后面添加nums[i],即为以i位置为结尾的最长递增子序列。

综上所述,dp[i]应该取:「1」和「所有满足0 <= j < i并且nums[j] < nums[i]的j中,最大的dp[j]加1」的较大值。

所以,我们可以把dp表的值都初始化为1,其中dp[0] = 1是显然的。如果i > 0,那么dp[i]就应该取:所有满足0 <= j < i并且nums[j] < nums[i]的j中,最大的dp[j]加1

填表顺序:根据状态转移方程,显然应从左往右填表

返回值:根据状态表示,应返回dp表的最大值

细节问题:dp表的规模和nums相同,均为1 x n

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();// 创建dp表vector<int> dp(n, 1);// 填表for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[j] < nums[i]) {dp[i] = max(dp[i], dp[j] + 1);}}}return *max_element(dp.begin(), dp.end());}
};
http://www.lryc.cn/news/382066.html

相关文章:

  • 深度神经网络DNN概念科普
  • Tomcat WEB站点部署
  • IPv6 中 MAC 33:33 的由来
  • 告别手动邮件处理:使用imbox库轻松管理你的收件箱
  • Ubuntu 18.04 安装 PCL 1.14.1
  • 公司logo设计大全怎么找?直接帮你设计logo
  • 如何调整C#中数组的大小
  • 通过言语和非言语检索线索描绘睡眠中的记忆再激活茗创科技茗创科技
  • MDPI旗下SSCI最新影响因子目录出炉!“水刊“Sustainability表现如何?
  • Matlab基础篇:数据输入输出
  • MySQL字典数据库设计与实现 ---项目实战
  • python数据分析——数据预处理
  • 【Python】使用matplotlib绘制图形(曲线图、条形图、饼图等)
  • vue下载本地xls模版静态文件
  • 手机开热点,里面的WPA2-Personal和WPA3-Personal的区别
  • 算法课程笔记——点积叉积
  • 详解 | DigiCert EV代码签名证书
  • pdf压缩大小,PDF压缩大小不影响清晰度
  • 项目管理必备工具:2024年十大软件排行榜
  • SOLIDWORKS专业版2024价格
  • 【外快业务】百度网盘扫码源码系统部署过程记录。
  • lucene原理
  • 华为、H3C交换机常用巡检命令
  • 网络安全 DVWA通关指南 SQL Injection(SQL注入)
  • 【Linux】版本
  • 代码随想录算法训练营day47
  • 【Android面试八股文】Kotlin内置标准函数apply的原理是什么?
  • RegionClip环境安装踩坑指南
  • MySQL数据类型、运算符以及常用函数
  • 算法设计与分析:动态规划法求扔鸡蛋问题 C++