Skip to content

Commit ec0d01a

Browse files
authored
Update 0300-最长上升子序列.py
1 parent 9cdddfe commit ec0d01a

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed
Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1-
class Solution(object):
2-
def lengthOfLIS(self, nums):
3-
"""
4-
:type nums: List[int]
5-
:rtype: int
6-
"""
7-
dp = [1 for _ in nums]
8-
1+
状态定义
2+
dp[i]的值代表 nums nums[i] 结尾的最长子序列长度
3+
4+
转移方程 j∈[0,i),考虑每轮计算新 dp[i]dp[i]dp[i] 遍历 [0,i) 列表区间做以下判断
5+
1. nums[i]>nums[j] nums[i] 可以接在 nums[j] 之后此题要求严格递增),此情况下最长上升子序列长度为 dp[j]+1
6+
2. nums[i]<=nums[j] nums[i] 无法接在 nums[j] 之后此情况上升子序列不成立跳过
7+
上述所有 1. 情况 下计算出的 dp[j]+1 的最大值为直到 i 的最长上升子序列长度 dp[i])。实现方式为遍历 j 每轮执行 dp[i]=max(dp[i],dp[j]+1)。
8+
转移方程dp[i] = max(dp[i], dp[j] + 1) for j in [0, i)。
9+
10+
初始状态
11+
dp[i] 所有元素置 1含义是每个元素都至少可以单独成为子序列此时长度都为 1
12+
13+
返回值
14+
返回 dp 列表最大值即可得到全局最长上升子序列长度
15+
16+
# Dynamic programming.
17+
class Solution:
18+
def lengthOfLIS(self, nums: List[int]) -> int:
19+
if not nums: return 0
20+
dp = [1] * len(nums)
921
for i in range(len(nums)):
1022
for j in range(i):
11-
if nums[i] > nums[j]:
23+
if nums[j] < nums[i]: # 如果要求非严格递增,将此行 '<' 改为 '<=' 即可。
1224
dp[i] = max(dp[i], dp[j] + 1)
13-
14-
return max(dp) if dp else 0
25+
return max(dp)
26+
27+
作者Krahets
28+
链接https://leetcode.cn/problems/longest-increasing-subsequence/solutions/24173/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/
29+
来源力扣LeetCode
30+
著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处

0 commit comments

Comments
 (0)