Leetcode300.最长递增子序列
题目描述
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例一
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例二
输入:nums = [0,1,0,3,2,3]
输出:4
示例三
输入:nums = [7,7,7,7,7,7,7]
输出:1
题解
首先注意“子序列”和“子串”的不同,前者不一定是连续的,而后者一定是连续的。
解题思路:动态规划
dp数组含义:dp[i]表示以nums[i]这个数结尾的最长递增子序列的长度。
index | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
nums | 3 | 6 | 5 | 7 | 4 |
dp | 1 | 2 | 2 | 3 | 2 |
python代码
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
res = 0
for i in range(len(nums)):
res = max(res, dp[i])
return res