一、题目描述
**给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。**例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
二、思路
那必须是暴力匹配法水过去了,哈哈哈哈,想了半天 发现没思路,OK 直接上DP。
1.首先确定DP数组的含义
dp保存着nums第i个数的最大增长子序列的长度dp[i]。
例如 dp[2] = 3 表示nums[:2+1] 这个序列的最大增长子序列的长度是3。
初始值设置啥多少都可以,设置成1 吧。
2.推导式
。。。。。。。。啊啊啊啊啊,推不出来, 笑死。
啊 , 我悟了,第 i 个数应该 要比nums[i]之前的值要小,这样才能是增长序列啊,所以dp[i] = nums[:i](nums[i-1], nums[i-2]…) 的最长的序列且值要比nums[i]要小 在加1就是他的最长序列长度。
三、代码实现
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = [1] * len(nums)
for idx, val in enumerate(nums):
j = idx
# 找出比 val 小的 且 dp[j]最大的值,
m = 0
while j >= 0:
if nums[j] < val and dp[j] > m:
m = dp[j]
j -= 1
dp[idx] = m+1
return max(dp)
早知道选土木就不用遭这罪了,造孽啊。