最长上升子序列300

题目:给定一个无序的整数数组,找到其中最长上升子序列的长度。

输入:[10,9,2,5,3,7,101,18]

输出:4

解释:最长的上升子序列是 [2,3,7,101],它的长度是 4。

思路:动态规划

状态:

1
dp[i]表示一定将i纳入最长子序列时最长子序列的长度

分析:

对于j from 0 to i: 如果nums[i] > nums[j], 则dp[j]更新,选择最大的

状态转移:

1
2
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] +1)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class :
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0

n = len(nums)
dp = [1 for x in range(n)]
for i in range(n):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)

# 例子
a = [10, 9, 2, 5, 3, 7, 101, 18]
print(Solution().lengthOfLIS(a))