最长连续递增子序列

893 阅读2分钟

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

一、题目描述:

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

输入: nums = [1,3,5,4,7]
输出: 3

该数组有两个递增子序列,[1,3,5]和[4,7],长度分别为3和2,最长的序列长度为3。

二、思路分析:

为了得到最长递增子序列,我们应该遍历数组,判断后一个数是否大于当前遍历到的值,如果符合条件,说明说明当前元素和下一个元素是递增序列。

function findLengthOfLCIS (nums) {
  if (nums.length <= 0) {
    return nums.length
  }
  let ans = 1
  let count = 1
  for (let i = 0; i < nums.length - 1; i++) {
    if (nums[i + 1] > nums[i]) {
      count++
    } else {
      count = 1
    }
    ans = count > ans ? count : ans
  }
  return ans
}

我们通过判断比较两个值的大小判断递增序列即可,每次遍历到元素符合递增序列就加1即可。

上面代码也没什么问题,但是不够优雅,作为算法大神门都喜欢用双指针,那么我们写写吧。

function findLengthOfLCIS (nums) {
  let ans = 0
  let start = 0
  for (let i = 0; i < nums.length; i++) {
    if (i > 0 && nums[i] <= nums[i - 1]) {
      start = i
    }
    ans = Math.max(ans, i - start + 1)
  }
  return ans
}

如果下标 i>0 且 nums[i]≤nums[i−1],则说明当前元素小于或等于上一个元素,因此 nums[i−1] 和 nums[i] 不可能属于同一个连续递增序列。

我们需要统计序列的长度,所以我们需要一个起点和一个终点,通过两个变量存储位置关系,下标范围 [start, i],而且每段递增序列的长度我们需要计算最大值。

四、总结:

其实我们主要还是要掌握双指针的用法,很多面试题都需要用这种思路,双指针主要包括一个快一个慢的指针,从而形成一个区间,根据不同的区间最后计算最终结果。