LeetCode每日一题之最长连续递增序列

72 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

题目描述

image.png

题目分析

一看到"连续"二字,我本来以为是要比300.最长递增子序列要难一些的,可是一看题解,其实要简单很多,因为是求最长连续递增子序列,中间只要有一个数不是递增就断了,就必须从新计算递增子序列的长度,每次循环都比较递增子序列的长度,更新最大值即可。

状态转移分析

1.dp[i]的定义:
dp[i]表示从0-i之间最长递增子序列的长度值
2.状态转移分析:
由dp[i]到dp[i+1]有两种情况: 如果nums[i+1]>nums[i]: dp[i+1] = dp[i] + 1
如果nums[i+1]<=nums[i]: 必须重新计算dp[i]的值 dp[i] = dp[i]
3.初始值定义:
如果nums的长度小于等于1,返回nums.length
如果nums.length > 1, 即使nums是一个递减数组,那么其最长递增子序列的长度也应该是1,所以dp初始值都为1
4.遍历顺序:
有dp[i+1] = dp[i] + 1可知,应该从前往后遍历

代码实现

var findLengthOfLCIS = function(nums) {
  if (nums.length <= 1) return nums.length;
  const dp = Array(nums.length).fill(1);
  let result = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] < nums[i + 1]) {
      // 如果nums[i+1] > nums[i] dp[i+1] 的值应该比dp[i]大1
      dp[i + 1] = dp[i] + 1;
    } // 如果小于等于 相当于不处理
    if (dp[i] > result) result = dp[i]; // 每次循环更新最大值
  }

  return result;
};

贪心算法

其实本地用贪心算法可能会更好理解一些,初始化最长递增子序列的长度为count = 1,最终结果result=1;循环遍历nums数组,如果nums[i+1]>nums[i],则count++;反之则让count=1;每次循环比较count与result的大小,更新最后结果,代码实现如下:

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

  return result;
};