一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
一.题目:
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。
提示:
1 <= nums.length <= 104-109 <= nums[i] <= 109
二、思路分析:
这是一道难度为简单的数组题目,要求我们能够找到最长连续递增序列并且返回该长度。首先我们需要了解什么是连续递增序列,即元素都必须是连续的不能存在间隔,所以基本思路也就围绕着连续来展开。
- 首先初始化参数,如结果,目前最大的长度,本文采用快慢指针的思路解决这道题目,初始化
快慢指针 - 在循环体中只需要判断快指针的元素是否大于慢指针的元素,如果大于的话就可以更新目前的最大长度
tempmax,然后快慢指针同步前进,就是因为需要连续所以快慢指针同步前进,随后一直执行循环语句。 - 如果发现慢指针指向的元素大于快指针,那么我们将目前的最大长度重置为
1,然后再同步前进。每次结束一个循环都要判断结果maxNum与目前的最大长度tempmax的大小然后更新maxNum,最后结果即是最终的答案。
三、代码:
/**
* @param {number[]} nums
* @return {number}
*/
var findLengthOfLCIS = function(nums) {
let maxNum = Number.MIN_SAFE_INTEGER
let len = nums.length
if(len == 1)return 1
//快慢指针
let left = 0,right = 1
let tempmax = 1
while(right < len){
if(nums[left] < nums[right]){
tempmax++
}else{
tempmax = 1
}
left++
right++
maxNum = Math.max(maxNum,tempmax)
}
return maxNum
};
四、总结:
这道题因为是考察连续序列的问题所以我们使用
快慢指针同步前进比较的策略,如果是考察递增序列而不是连续递增序列的时候我们就应该采用动态规划的思路解决问题。