【LeetCode-674】最长连续递增序列(动归)

目录

LeetCode674.最长连续递增序列

题目描述

解法1:动态规划

代码实现


题目链接

题目描述

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

连续递增的子序列 可以由两个下标 l 和 r(l < 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 隔开。

示例 2:

  • 输入:nums = [2,2,2,2,2]

  • 输出:1

  • 解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 0 <= nums.length <= 10^4

  • -10^9 <= nums[i] <= 10^9

解法1:动态规划

这个题求连续的递增序列,我们在遍历的过程中,也可以使用dp数组将我们每一个位置的最长递增序列表示出来,如果当前nums数组的值大于上一个位置的值,那么看上一个dp[i-1]的值,如果不为0则dp[i] = dp[i-1] + 1;

  1. 确定dp数组(dp table)以及下标的含义

dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]

注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。

  1. 确定递推公式

如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。

即:dp[i] = dp[i - 1] + 1;

因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。

  1. dp数组如何初始化

以下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。所以dp[i]应该初始1;

  1. 确定遍历顺序

从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。

本文在确定递推公式的时候也说明了为什么本题只需要一层for循环,代码如下:

java 复制代码
for (int i = 1; i < nums.size(); i++) {
    if (nums[i] > nums[i - 1]) { // 连续记录
        dp[i] = dp[i - 1] + 1;
    }
}
代码实现
java 复制代码
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int len = nums.length;
        if (len == 1) return 1;
        int max = 0;
        int temp = 1;
        for (int i = 1; i < len; i++) {
            if (nums[i] > nums[i-1]) {
                temp++;
            }else {
                temp = 1;
            }
            max = Math.max(max,temp);
        }
​
        return max;
    }
}
相关推荐
cyforkk1 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
仙俊红1 小时前
LeetCode487周赛T2,删除子数组后的最终元素
数据结构·算法
身如柳絮随风扬6 小时前
Java中的CAS机制详解
java·开发语言
-dzk-7 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅8 小时前
hot100 78.子集
java·算法
Jasmine_llq8 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪8 小时前
快速进制转换
笔记·算法
m0_706653238 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你918 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233909 小时前
C++与Python混合编程实战
开发语言·c++·算法