Bootstrap

数据结构与算法之动态规划: LeetCode 674. 最长连续递增序列 (Ts版)

最长连续递增序列

描述

  • 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度
  • 连续递增的子序列 可以由两个下标 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 <= 1 0 4 10^4 104
  • - 1 0 9 10^9 109 <= nums[i] <= 1 0 9 10^9 109

Typescript 版算法实现


1 ) 方案1: 贪心

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

2 ) 方案2: 贪心变体

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

3 ) 方案3: 动态规划

function findLengthOfLCIS(nums: number[]): number {
    // 获取长度
    const n = nums.length;
    if (n <= 1) return n;
    // 定义记录结果的变量
    let count: number = 0;
    // 定义dp数组并初始化为1
    let dp: number[] = new Array(n).fill(1);
    // 遍历
    for (let i = 1; i < n; i++) {
        if (nums[i - 1] < nums[i]) {
            // 状态转移方程: 不连续递增子序列的跟前 0-i 个状态有关,连续递增的子序列只跟前一个状态有关
            dp[i] = dp[i - 1] + 1;
        }
        // 记录dp数组中的最大值
        if (count < dp[i]) count = dp[i];
    }
    return count;
}
;