最长上升子序列
300.最长上升子序列
#动态规划
def lengthOfLIS(nums):
if not nums:
return 0
dp = []
for i in range(len(nums)):#dp[i]存储第i个位置最长上升子序列
dp.append(1)
for j in range(i):#对i前面的元素,如果小于i,上升+1
if nums[i] > nums[j]:
dp[i] = max(dp[i],dp[j]+1)
return max(dp)
#贪心+二分查找
# if nums[i]>cell 中所有元素,直接添加到末尾,
# 否则覆盖掉cell中比nums[i]大的元素中最接近nums[i],上升序列长度不变
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
d = []
for n in nums:
if not d or n > d[-1]:
d.append(n)
else:
l, r = 0, len(d) - 1
loc = r
while l <= r:
mid = (l + r) // 2
if d[mid] >= n:#n在左半部分,mid表示比n大的最接近n的最小值
loc = mid
r = mid - 1
else:
l = mid + 1
d[loc] = n
return len(d)