力扣674-最长连续递增序列(Java详细题解)

题目链接:674. 最长连续递增序列 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

该题对比于力扣300-最长递增子序列,不同点就在于本题是求连续的递增序列。他要求序列是连续的。

继续用dp五部曲来分析:

1.确定dp数组和i下标的含义。

dp[i] 指的就是以i下标为结尾的数组所能找到的最长且连续递增的子序列。

2.确定递推公式。

既然要找连续子序列,说明下标为i的状态,只与他前一个状态(i - 1)有关。

当nums[i] > nums[i - 1]时,这样才是一个连续递增的序列,才能加入我们的结果集。

所以本题就用一层循环,不断求nums[i - 1]和nums[i]的状态对比。

所以递推公式就为dp[i] = Math.max(dp[i - 1] + 1,dp[i]);

当nums[i] > nums[i - 1]时,我们得把以i - 1为结尾的最长递增子序列求出再加上nums[i]的长度就为以i为结尾的最长连续递增子序列。

因为我们要取最大,所以还需要对dp[i]取一个最大值。

3.dp初始化。

由dp定义可知。dp[i]取不同的i都至少有一个最长连续递增的序列,所以我们就让dp数组的所有值都初始化为1。

4.确定dp的遍历顺序。

由递推公式可以推出dp[i]的状态只与dp[i - 1]有关,所以遍历顺序一定是要从前往后遍历的。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        //该题与上一个题唯一的区别就是他要是连续的 连续的话 如果 nums[i - 1] < nums[i] 那么dp[i] = dp[i - 1] + 1;
        //在这里我初始化result = 1就是为了当nums.length = 1的情况会不进循环,直接返回result,而此时result 如果为0,那么结果就为0。
        //而就算nums.length = 1,他的连续递增子序列也应该是1,就是他本身,所以我初始化为1就是为了避免这个情况。
        int result = 1;
        int dp [] = new int [nums.length + 1];
        Arrays.fill(dp,1);
        for(int i = 1;i < nums.length;i ++){
            if(nums[i] > nums[i - 1]){
                dp[i] = dp[i - 1] + 1;
            }
            result = Math.max(result,dp[i]);
        }
        return result;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值