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],而且每段递增序列的长度我们需要计算最大值。
四、总结:
其实我们主要还是要掌握双指针的用法,很多面试题都需要用这种思路,双指针主要包括一个快一个慢的指针,从而形成一个区间,根据不同的区间最后计算最终结果。