给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
解题思路:
这是一道动态规划问题,考虑使用dp数组求解,简单来说:首先遍历每一个有序子序列,用该子序列的最后一个元素同全前面的每一个元素进行比较,若当前子序列更大,则替换掉。
其中dp[j]表示前 j 个元素对应的最大子序列长度。
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
counts = len(nums)
#表示前n个元素对应的最长子序列长度dp[n]
dp = [1 for _ in range(counts)]
for i in range(counts):
sub_nums = nums[:i+1]
#遍历sub_nums
num = sub_nums[-1]
for j in range(i):
value = nums[j]
if num > value and dp[j]+1 > dp[i]:
dp[i] = dp[j]+1
#或者这种写法dp[i] = max(dp[i],dp[j]+1)
#注意:这里返回的是最大的序列的长度,所以是dp的最大值
return max(dp)
提交结果: