写点什么

头脑风暴:最长连续递增序列

  • 2022 年 8 月 18 日
    江苏
  • 本文字数:827 字

    阅读完需:约 3 分钟

头脑风暴:最长连续递增序列

题目

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


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


提示:


  • 0 <= nums.length <= 10^4

  • -10^9 <= nums[i] <= 10^9

解题思路

根据题意,本题可用动态规划的方式来求解。


第一步,确定 dp 数组以及下标的含义:


dp[i]:以下标 i 为结尾的数组的连续递增的子序列长度为 dp[i]。


第二步,确定递推公式:


如果 nums[i + 1] > nums[i],那么以 i+1 为结尾的数组的连续递增的子序列长度一定等于 以 i 为结尾的数组的连续递增的子序列长度 + 1 。所以可以得出递推公式为:dp[i + 1] = dp[i] + 1;


第三步,dp 数组初始化:


连续递增的子序列长度最少是 1, 所以 dp 数组应该初始化为 1。


第四步,确定遍历顺序:


从递推公式上可以看出, dp[i + 1]依赖 dp[i],所以一定是从前向后遍历。

代码实现

class Solution {    public int findLengthOfLCIS(int[] nums) {        if(nums.length == 0){            return 0;        };        int count = 1;        int len = nums.length;        int[] dp = new int[len];        for(int i = 0; i < len; i++){            dp[i] = 1;        }
for(int i = 0; i < len - 1; i++){ if(nums[i+1] > nums[i]){ dp[i+1] = dp[i] + 1; } if(dp[i+1] > count) count = dp[i+1]; }
return count; }}
复制代码

最后

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(1)。

发布于: 刚刚阅读数: 4
用户头像

佛系编码 2019.05.13 加入

红鲤鱼与绿鲤鱼与驴。

评论

发布
暂无评论
头脑风暴:最长连续递增序列_算法_HelloWorld杰少_InfoQ写作社区