[滑动窗口]674. 最长连续递增序列

287 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

每日刷题第72天 2021.03.30

674. 最长连续递增序列

题目描述

  • 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
  • 连续递增的子序列 可以由两个下标 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;
};

总结

  • 区间不同的定义,决定了不同的初始化逻辑、遍历过程中的逻辑。