【lc刷题】300 最长上升子序列(DP&bisect)_Day13(47/300)

47/300

  1. 最长上升子序列
     
    给定一个无序的整数数组,找到其中最长上升子序列的长度。
     
    示例:
     
    输入: [10,9,2,5,3,7,101,18]
    输出: 4
    解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
    说明:
     
    可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
    你算法的时间复杂度应该为 O(n2) 。#动态规划
    进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? #二分查找
     
    测试集:
    [4,10,4,3,8,9]
    [4,10,4,3,2,1]
    [10,9,2,5,3,7,101,18,19,20,30]
    []
    [0]
    [10,10,10]
    [1,3,6,7,9,4,10,5,6]

动态规划类型,第四道:O(n*n)

在这里插入图片描述
在这里插入图片描述

class Solution:
    def lengthOfLIS(self, nums):
        if not nums: return 0

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

        return max(memo)

【优化】使用二分查找:O(nlogn)

python中使用bisect二分查找插入位置
在这里插入图片描述

class Solution:
    def lengthOfLIS(self, nums):
		lst = [] 
		for num in nums:
			p = bisect.bisect_left(lst, num)
			#找到此数字可能插入的位置
			
			if p == len(lst): 
				lst.append(num) 
			#66的position是0 == len([]) or 77的position3 == len([0,10,20])
			#[66] [0,10,20,77]
			
			else: 
				lst[p] = num
			#9的postion是1 != len([0,10,20]) 
			#[0,9,20]
		return len(lst)

举例nums = [4,10,4,5,2,1]
num = 4, lst = [4]
num = 10, lst = [4, 10]
num = 4, lst = [4, 10]
num = 5, lst = [4, 5]
num = 2, lst = [2, 5]
num = 1, lst = [1, 5]
不难看出,题目要求是长度,所以无碍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值