给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 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。
思路:这道题可以用贪心和动规两种方法来做,首先看贪心: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数组里的最大值即可。