LeetCode_137_LongestContinuousIncreasingSubsequence


1. question: 最长连续递增序列(简单)

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence

示例 1:

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

示例 2:

1
2
3
输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

1
2
1 <= nums.length <= 104
-109 <= nums[i] <= 109

2. answers

本题要求子序列元素是连续的,因此,可直接遍历,如果当前元素比前一个元素小,那么就说明形成了一个子序列,记录其长度即可。然后继续遍历形成下一个子序列,最终取最大值即可。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Solution_0137 {

public int findLengthOfLCIS(int[] nums) {

int result = 0;

int length = 1;
for (int i = 1; i < nums.length; i++) {

if(nums[i] > nums[i-1]) length++;
else {
result = Math.max(result, length);
// 注意,这里是为1,因为这里说明的是当前元素和前面的元素不是一个序列,说明本元素是下一个序列的首元素。
length = 1;
}
}

// 最终还要额外比较一下,防止最后一个子序列没有比较
result = Math.max(result, length);

return result;
}

public static void main(String[] args) {
System.out.println();

Solution_0137 s = new Solution_0137();

// int[] nums = {1,3,5,4,7};
int[] nums = {2,2,2,2,2};

System.out.println(s.findLengthOfLCIS(nums));

}
}

其实仍然可采用动态规划的思路来做。定义数组dp[i]表示以i元素结尾的子序列的长度。显然dp[i+1]的状态取决于元素i+1是否大于元素i,如果大于,那么就将其加入子序列,如果不大于,那么子序列就是其自身。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Solution_0137_02 {

public int findLengthOfLCIS(int[] nums) {

// 定义数组,表示以第i个元素结尾的连续子序列元素个数
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);

for (int i = 1; i < nums.length; i++) {
if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;
}

int result = 0;

for (int i = 0; i < dp.length; i++) {
result = Math.max(result, dp[i]);
}

return result;
}

public static void main(String[] args) {
System.out.println();

Solution_0137_02 s = new Solution_0137_02();
// int[] nums = {1,3,5,4,7};
// int[] nums = {2,2,2,2,2};
int[] nums = {1,3,5,4,2,3,4,5};

System.out.println(s.findLengthOfLCIS(nums));
}
}

3. 备注

参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com)代码随想录 (programmercarl.com)


文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录