力扣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;
}
}
这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。
我很乐意为你解答。那么我们下篇再见!