Skip to content

最长连续递增序列

题目描述

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

题目链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence

文章讲解:https://programmercarl.com/0674.最长连续递增序列.html

思路

与上一题的区别在于连续。上一题我们在递推出dp[i] 的时候我们要找到 [0,i-1] 之间的 所有 dp 值,找出最长的那个 +1。

这道题有了连续,示例中,计算dp[4] 时,它的最长连续递增序列是 [4,7],并不能以原本定义中的 dp[0] dp[1] dp[2] 得出,因为这三者都经历了 nums[3] 这个数导致子序列没有严格递增。

所以,要想得到dp[4] 就必须确定前一个元素是连续递增序列的末尾元素才可以。此时dp[0] dp[1] dp[2] 就没必要计算了。 这里就是动态规划:300.最长递增子序列 (opens new window)的区别!

动规五部曲

1、dp数组及下标含义

dp[i]表示i之前包括i的以nums[i]结尾的最长连续递增子序列的长度

2、递推公式

nums[i] > nums[i - 1]dp[i] = dp[i-1] + 1;

4、确定遍历顺序

从前向后遍历

5、举例推导

输入nums = [1,3,5,4,7]为例,dp数组状态如下:

674.最长连续递增序列

注意这里依然要要取所有dp[i]里的最大值,即dp[2]

代码实现

C++
int findLengthOfLCIS(vector<int> &nums) {
    if (nums.size() <= 1)
        return 1;
    vector<int> dp(nums.size(), 1);
    int result = 0;
    for (int i = 1; i < nums.size(); i++) {
            if (nums[i] > nums[i - 1])
                dp[i] = dp[i - 1] + 1;
        if (dp[i] > result) result = dp[i];
    }
    return result;
}