class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
方法一,动态规划
if not nums:
return 0
dp = [1]*len(nums)#dp【0】以0位结尾的,最长上升子序列长度为1
for i in range(1,len(nums)):
for j in range(i):
if nums[i]>nums[j]:
dp[i] = max(dp[i],dp[j]+1)
return max(dp)
方法二,动态规划+二分
top = []
for i in range(len(nums)):
left,right=0,len(top)-1
while left<=right:
mid = left+(right-left)//2
if top[mid]<nums[i]:
left = mid + 1
else:
right = mid - 1
#left表示在【0,len(top))的索引中,第一个大于nums[i]的索引
if left==len(top):
top.append(nums[i])
else:
top[left]=nums[i]
return len(top)
参考链接:
https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/
https://blog.csdn.net/qq_36512295/article/details/100835261
时间复杂度n2->nlogn,空间复杂度都是n
最长上升子序列,经典
最新推荐文章于 2024-01-18 16:25:43 发布