Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
每日刷题第72天 2021.03.30
674. 最长连续递增序列
- leetcode原题链接:leetcode-cn.com/problems/lo…
- 难度:简单
- 方法:双指针、滑动窗口
题目描述
- 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
- 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
示例
- 示例1
输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
- 示例2
输入: nums = [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。
解题思路
- 根据题意:需要查找最长的、递增的序列,那么也就是序列中不能存在递减或者相等的情况。
- 分析:对相邻的两个元素检查,前一个小于后一个,那么连续的一串,一定是递增的。
- 注意⚠️:相邻的两个数比较,直接使用
j 和 j - 1即可,不需要再声明一个变量 i统一表示每个连续递增序列的初始下标位置(即:符合要求的序列的第一个元素的下标)
第一种区间
- 区间的确定:
[i,j) - 左闭右开区间,表示
j下标的元素不包含在递增的连续序列中,其是第一个不符合递增条件的元素,因此j左边的元素,全部包含在递增的连续序列中,此时有效长度为j - i(此处不需要+1,因为当前j这个元素并不符合要求)
第二种区间
- 区间的确定:
[i,j] - 左闭右闭区间,表示
j下标的元素包含在递增的连续序列中,是符合要求的序列的最后一个元素,因此此时的区间长度应该是j - i + 1
AC代码
/**
* @param {number[]} nums
* @return {number}
*/
var findLengthOfLCIS = function(nums) {
// 最长且连续递增
// 等于或者小于的时候,不满足;也就是说如果大于,就一直可以往后扩展
// l - r + 1区间长度[l,r) = r - l
let l = 0,r = 1,maxx = 0,len = nums.length;
let pre = 0;
while(l < len){
if(nums[l] < nums[r]){
r++;
l++;
}else {
maxx = Math.max(maxx, r - pre);
l = r;
pre = l;
// console.log(pre)
r++;
}
}
return maxx;
};
总结
- 区间不同的定义,决定了不同的初始化逻辑、遍历过程中的逻辑。