674. 最长连续递增序列
题目描述
输入一个整数数组 nums,数组未排序。
在数组中找一段连续的元素 nums[l..r],要求其中每个元素都严格小于它后面紧挨着的那个,即对所有 l <= i < r 有 nums[i] < nums[i + 1]。
返回这种连续严格递增片段的最大长度。单个元素也算一段,长度为 1。
示例 1
输入:nums = [1,3,5,4,7] 输出:3
解释:[1,3,5] 长度为 3;[1,3,5,7] 虽然递增但在原数组中不连续。
示例 2
输入:nums = [2,2,2,2,2] 输出:1
解释:相邻元素都相等,最长只能取一个元素。
数据范围
1 <= nums.length <= 10^4-10^9 <= nums[i] <= 10^9
解题思路
一次扫描。cur 表示以 nums[i] 结尾的连续递增段长度:若 nums[i] > nums[i-1],这一段延长,cur += 1;否则从 nums[i] 重新开始,cur = 1。每次延长后用 cur 更新答案 best。
为什么正确
处理完下标 i 后,cur 等于以 i 结尾的最长连续严格递增段长度,best 等于 nums[0..i] 中的答案。
复杂度分析
时间 O(n),空间 O(1)。
易错点
要求严格递增,相等的相邻元素也会断开(用 > 而不是 >=);best 初值为 1,因为单个元素本身就是长度 1 的递增序列。
参考代码
Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
best = cur = 1
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
cur += 1
best = max(best, cur)
else:
cur = 1
return bestclass Solution {
public int findLengthOfLCIS(int[] nums) {
int best = 1, cur = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur++;
best = Math.max(best, cur);
} else {
cur = 1;
}
}
return best;
}
}class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int best = 1, cur = 1;
for (int i = 1; i < (int)nums.size(); i++) {
if (nums[i] > nums[i - 1]) {
cur++;
best = max(best, cur);
} else {
cur = 1;
}
}
return best;
}
};func findLengthOfLCIS(nums []int) int {
best, cur := 1, 1
for i := 1; i < len(nums); i++ {
if nums[i] > nums[i-1] {
cur++
best = max(best, cur)
} else {
cur = 1
}
}
return best
}var findLengthOfLCIS = function(nums) {
let best = 1, cur = 1;
for (let i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur++;
best = Math.max(best, cur);
} else {
cur = 1;
}
}
return best;
};function findLengthOfLCIS(nums: number[]): number {
let best = 1, cur = 1;
for (let i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur++;
best = Math.max(best, cur);
} else {
cur = 1;
}
}
return best;
}