最长上升子序列

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)

posted @ 2020-03-14 16:29  鱼与鱼  阅读(140)  评论(0编辑  收藏  举报