674. 最长连续递增序列

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

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

思路:这道题可以用贪心和动规两种方法来做,首先看贪心:result保存最后的结果,count保存每个数为结尾的最大递增子序列,在遍历过程中及时更新result的值,遍历数组,如果碰到当前的数大于前一个数,那就 count +1,否则就不是连续递增了,count重置为初始值1。

代码(Python):

class Solution(object):
    def findLengthOfLCIS(self, nums):
        if len(nums) == 0:
            return 0
        result = 1
        count = 1
        for i in range(1,len(nums)):
            if nums[i] > nums[i-1]:
                count += 1
                result = max(result,count)
            else:
                count = 1
        return result

那再来看看动规怎么解决这道题。

首先明确dp[i]的含义,dp[i]代表以nums[i]结尾的最长连续递增子序列的长度。

然后递推公式:因为要连续递增,因此每个数要和前一个数进行比较,如果当前数大于前一个数,那最长递增子序列+1,更新dp[i]的值,dp[i] = max(dp[i],dp[i-1]+1), 否则,当前数小于前一个数了,递增中断了,不是连续了,那就不用更新dp[i]的值。

然后是初始化,我们可以看到每个i都依赖i-1的值,因此我们需要初始化dp[0],因为递增子序列最短也会是1,也就是每个数自己,所以初始化为1。

然后是遍历顺序,很明显是从前往后。

最后得到的dp数组就是以每个数为结尾的连续递增子序列的长度,输出dp数组里的最大值即可。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值