首页 > 其他分享 >「动态规划」如何求最长递增子序列的长度?

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

时间:2024-07-02 10:00:16浏览次数:23  
标签:元素 nums 递增 位置 序列 最长 dp

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());
    }
};

标签:元素,nums,递增,位置,序列,最长,dp
From: https://blog.csdn.net/xiang_bolin/article/details/139932063

相关文章

  • 【算法探秘】无重复字符的最长子串:解锁字符串中的独特风景
    【算法探秘】无重复字符的最长子串:解锁字符串中的独特风景一、引言:在字符的海洋中航行二、技术概述:独步字符森林技术定义核心特性代码示例:初尝甜蜜果实三、技术细节:拨开迷雾,洞悉本质原理解析难点剖析四、实战应用:字节跳跃,解密信息应用场景案例展示五、优化与改进:精益......
  • 课前准备---从单细胞数据如何识别肿瘤特异性的TCR序列
    作者,EvilGenius参考文章Predictionoftumor-reactiveTcellreceptorsfromscRNA-seqdataforpersonalizedTcelltherapy|NatureBiotechnology鉴别源自患者的肿瘤反应性T细胞受体(Tcellreceptors,TCR)作为个性化转基因T细胞疗法的基础,仍然是一项耗时且费用昂贵的工......
  • 代码随想录算法训练营第50天 | 1143.最长公共子序列 、1035.不相交的线 、53. 最大子
    这几题都挺类似,都是求最长公共子序列,有些题目稍微变了下1143.最长公共子序列体会一下本题和718.最长重复子数组的区别视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQhttps://programmercarl.com/1143.最长公共子序列.html/***@param{string}text1*@param{......
  • P6587 超超的序列 加强
    P6587超超的序列加强01trie+树上维护好题,使我调不出来。观察\(i\)满足的条件,在二进制上分析,\(i\bmod2^x\)实际上就是从低位开始的前\(x-1\)位。那么所有满足条件的\(i\)从低位开始的前\(x-1\)位都相同,这类似相同的前缀。考虑建01trie,那么所有满足条件的\(i\)......
  • 2024新版Coreldraw破解安装包下载附带激活码序列号,设计神助攻!
    【设计神器】CDR2024破解版,让创意飞起来!......
  • 2713. 矩阵中严格递增的单元格数 Hard
    给你一个下标从 1 开始、大小为 mxn 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。从起始单元格出发,你可以移动到 同一行或同一列 中的任何其他单元格,但前提是目标单元格的值 严格大于 当前单元格的值。你可以多次重复这一过程,从一个单元格移动到另一......
  • 代码随想录算法训练营第49天 | 300.最长递增子序列 、674. 最长连续递增序列 、718.
    300.最长递增子序列今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。视频讲解:https://www.bilibili.com/video/BV1ng411J7xPhttps://programmercarl.com/0300.最长上升子序列.html/***@param{number[]}nums*@return{number}*/varlengthOfL......
  • AI数据分析013:根据时间序列数据生成动态条形图
    文章目录一、介绍二、输入内容三、输出内容一、介绍动态条形竞赛图(BarChartRace)是一种通过动画展示分类数据随时间变化的可视化工具。它通过动态条形图的形式,展示不同类别在不同时间点的数据排名和变化情况。这种图表非常适合用来展示时间序列数据的变化,能够直......
  • C语言 | Leetcode C语言题解之第187题重复的DNA序列
    题目:题解:#defineMAXSIZE769/*选取一个质数即可*/typedefstructNode{charstring[101];intindex;structNode*next;//保存链表表头}List;typedefstruct{List*hashHead[MAXSIZE];//定义哈希数组的大小}MyHashMap;List*......
  • 给定一个实数序列,设计一个最有效的算法,找到一个总和最大的区间
    这个问题是经典的最大子数组和问题,也称为Kadane算法。我们可以使用动态规划的方法来高效地解决它。以下是解决方案的C++实现:classSolution{public:vector<int>maxSubArray(vector<double>&nums){if(nums.empty())return{};doub......