1. 题目:
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 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。
2. 我的代码:
class Solution: def findLengthOfLCIS(self, nums: List[int]) -> int: # dp数组下标的含义:[x, i]子数组;dp数组的含义:包含了第i个数后的序列的最长递增子序列 dp = [1] * len(nums) # 递推公式 for i in range(1, len(nums)): if nums[i] > nums[i - 1]: dp[i] = dp[i - 1] + 1 else: dp[i] = 1 return max(dp)
这道题非常简单,第一眼看过去,能够直接使用滑动窗口,就算没听说过滑动窗口,暴力也能破解。
但是,这里使用动态规划试一试,为了和之前的非连续递增序列做对比。
首先,dp数组下标的含义:[x, i]子数组;dp数组的含义:包含了第i个数后的序列的最长递增子序列。
然后是递推公式:该dp元素只需要根据上一个dp元素推断即可,如果比上一个元素大,则可以进行替换dp[i] = dp[i - 1] + 1
,如果不比上一个大,则从1开始:dp[i] = 1
最后输出dp数组中最大的。
当然在循环里记录最大值会更简便。