最长上升子序列(LeetCode-300)

简介: 最长上升子序列(LeetCode-300)

最长上升子序列(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 = [0,1,0,3,2,3]
输出:4


示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1


提示:


1 <= nums.length <= 2500

-104 <= nums[i] <= 104

进阶:


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


思路

五部曲


dp[i] 含义


包含下标 i的最长上升子序列

递推公式


寻找从 0 到 i − 1 各个位置的最长上升子序列加一的最大值


在 n u m s [ i ] > n u m s [ j ]的情况下

d p [ i ] = m a x ( d p [ i ] , d p [ j ] + 1 )


数组初始化


每一个最长上升子序列起始长度至少为1

遍历顺序


从前往后

测试用例



代码展示

class Solution
{
public:
    int lengthOfLIS(vector<int> &nums)
    {
        int n = nums.size();
        vector<int> dp(n, 1);
        int result = 1;
        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (nums[i] > nums[j])
                {
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            result = max(dp[i], result);
        }
        return result;
    }
};
目录
相关文章
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
1月前
acwing 895 最长上升子序列1
acwing 895 最长上升子序列1
30 3
|
1月前
acwing 896 最长上升子序列II
acwing 896 最长上升子序列II
26 2
力扣 2401. 最长优雅子数组
力扣 2401. 最长优雅子数组
107 0
|
6月前
leetcode-6131:不可能得到的最短骰子序列
leetcode-6131:不可能得到的最短骰子序列
48 0
|
6月前
leetcode-300:最长递增子序列
leetcode-300:最长递增子序列
44 0
|
6月前
leetcode-1143:最长公共子序列
leetcode-1143:最长公共子序列
58 0
|
算法
Leecode 300. 最长上升子序列
Leecode 300. 最长上升子序列
64 0
leetcode 300 最长递增子序列
leetcode 300 最长递增子序列
78 0
leetcode 300 最长递增子序列
leetcode 1143 最长的公共子序列
leetcode 1143 最长的公共子序列
94 0
leetcode 1143 最长的公共子序列