LeetCode:674. 最长连续递增序列(难度:🌟)

80 阅读2分钟

一、前言🌟

哈喽,小伙伴们,我是泽南👨‍🎓。不管你是准备跳槽还是在职苟着,都一起行动起来,顺应这个内卷时代干点该干的事儿👣。所以,赶紧跟着我的步伐卷起来吧⏰,变强从这一刻开始!➕🧈

二、题目介绍🌟

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

连续递增的子序列 可以由两个下标 l 和 rl < 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

解法一 :动态规划

解题思路:

以数组 [1,3,5,4,7,8,9,2] 为例,图表上每一个点即代表数组中的每一个数,本题求 “最长连续递增” 子序列的长度,也就是收集图中所有上坡片段的长度,最后取最大值即可。

image.png

  • 初始化数组dp,每个索引所对应的值均为1。
  • 从索引 0 的位置开始遍历,若后一个元素 大于 前一个元素,则 dp[i] = dp[i - 1] + 1; 递减则不做任何操作,相当于dp[i] = 1。
  • 循环结束,dp = [1, 2, 3, 1, 2, 3, 4, 1],取最大值4。
var findLengthOfLCIS = function (nums) {
    let dp = new Array(nums.length).fill(1);
    for (var i = 1; i < nums.length; i++) {
        if (nums[i] > nums[i - 1]) {
            dp[i] = dp[i - 1] + 1;
        }
    }
    return Math.max(...dp);
};

时间复杂度:O(n);

空间复杂度:O(n)。

  • 优化以上代码:降低空间复杂度
var findLengthOfLCIS = function (nums) {
    let dp0 = 1;
    let dp1 = 1;
    let max = 1;
    for (var i = 1; i < nums.length; i++) {
        if (nums[i] > nums[i - 1]) {
            dp1 = dp0 + 1;
            dp0 = dp1;
        } else {
            dp0 = 1;
            dp1 = 1;
        }
        max = Math.max(max, dp1);
    }
    return max;
};

时间复杂度:O(n);

空间复杂度:O(1)。

解法二 :滑动窗口

解题思路:

1.检测边界条件

2.滑动窗口,找到最长连续字串

var findLengthOfLCIS = function(nums) {
    // 1.检测边界条件
    if(nums.length<2) return nums.length
    
    // 2.滑动窗口,找到最长连续字串
    let left = 0, current = 0, right=1, len=1
    while(right<nums.length) {
        // 不是递增,移动 left 指向
        if(nums[right] <= nums[current]) {
            left = right  
        }
        // 计算当前的最大字串长度
        len = Math.max(len, right-left+1)
        current++
        right++
    }
    return len
};

解法三 :for循环

解题思路:

设定标志位2个。 循环数组。如果后一个大于前一个,COUNT++, MAX取最大值。否则。重置COUNT

var findLengthOfLCIS = function(nums) {
    var max = 0; var count = 0
    if(!nums.length) return 0

    for(var i = 0; i<nums.length-1; i++){      
       if (nums[i] < nums[i+1]){
           count ++
           max = Math.max(count,max)
           console.log(max)
           continue
       }else{
           count = 0
       }
    }
    return max+1
};

最后🌟:

☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。