题目描述
给定一个未经排序的整数数组,找到最长且 连续
的的递增序列(子数组)。
样例
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。
注意
- 数组长度不会超过 10000。
算法
(线性扫描) $O(n)$
- 记录每段合法子数组的起始位置 st,然后开始线性扫描数组,若发现 nums[i] <= nums[i - 1],则用 i - st 更新答案长度,并令 st 重新赋值为 i。
- 最后退出扫描时,用 n - st 再更新答案。
时间复杂度
- 每个位置仅遍历一次,故时间复杂度为 $O(n)$。
C++ 代码
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int n = nums.size(), st = 0, maxl = 0;
for (int i = 1; i < n; i++)
if (nums[i] <= nums[i - 1]) {
maxl = max(maxl, i - st);
st = i;
}
return max(maxl, n - st);
}
};