【leetcode】674.最长连续递增序列
距离上次更新本文已经过去了 337 天,文章部分内容可能已经过时,请注意甄别。
leetcode刷题笔记-674.最长连续递增序列。
题目
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r
,都有 nums[i] < nums[i + 1]
,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]]
就是连续递增子序列。
plaintext
1 | 示例 1: |
提示
plaintext
1 | 1 <= nums.length <= 104 |
思路和代码
这道题相比300.最长递增子序列多了一个连续的要求,这样一来思路其实就简单多了。
定义dp数组含义为i和i之前的最长递增子序列的长度(准确来说是以i为结尾的最长递增子序列的长度,子序列开始的下标不确定)
我们只需要判断当前位是不是比前一位大,如果比前一位大,那么就可以沿用之前的结果
cpp
1 | if(nums[i] > nums[i-1]){ |
这样就能很容易的写出代码来,时间和空间复杂度都是O(N)
。
cpp
1 | class Solution { |
优化
这个代码可以进行优化,因为每一次的递推只和前一个数字有关系,我们直接用一个变量来记录就够了,空间复杂度降低为O(1)
。
这样做就有点类似贪心的思路,我们认为当前位大于前一位就是一个上升子序列的局部最优,最终的全局最优就是找到一个最长的连续上升子序列。官方的贪心题解本质上和下面的写法是一样的思路。
cpp
1 | class Solution { |
顺带贴一下官方题解的贪心代码
cpp
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 慕雪的寒舍!