首页 > 编程语言 >LeetCode in Python 300. Longest Increasing Subsequence (最长递增子序列)

LeetCode in Python 300. Longest Increasing Subsequence (最长递增子序列)

时间:2024-04-05 19:58:51浏览次数:27  
标签:nums Python 元素 LIST mid len 300 Subsequence bisect

求最长递增子序列是深度优先搜索(DFS)的一种应用,有两种比较好的方法可以解决。第一种是动态规划法,时间复杂度为O(n*n),即设置边界条件和更新迭代公式求解最优解。第二种使用二分查找将时间复杂度降为O(nlogn)。本文给出两种方法的实现代码及说明。

示例:

图1 最长递增子序列输入输出示例 

方法一:

动态规划法

class Solution:
    def lengthOfLIS(self, nums):
        LIST = [1] * len(nums)
        
        for i in range(len(nums) - 1, -1, -1):
            for j in range(i + 1, len(nums)):
                if nums[i] < nums[j]:
                    LIST[i] = max(LIST[i], 1 + LIST[j])
        return max(LIST)

解释:

1)LIST为存储从每个元素出发能得到的最长递增子序列:

        LIST = [1] * len(nums)

        LIST初始值为1,即该数组元素本身作为序列值。

2)接着开始动态规划,如果该元素大于其下一个元素,即表明下一个元素可以成为递增子序列的一员跟该元素放在一起。此时,规划的对象就由该元素移至下一个元素,直至不满足判断条件。

        for i in range(len(nums) - 1, -1, -1):

                for j in range(i + 1, len(nums)):

                        if nums[i] < nums[j]:

                                LIST[i] = max(LIST[i], 1 + LIST[j])

        这里需要注意数组元素下标和两层循环的遍历区间

方法二:

代码:

class Solution:
    def lengthOfLIS(self, nums):
        LIST = []
        
        for x in nums:
            i = self.bisect_left(LIST, x)
            if i == len(LIST):
                LIST.append(x)
            else:
                LIST[i] = x
        return len(LIST) 

    def bisect_left(self, LIST, x):
        l, r = 0, len(LIST)
        while l < r:
            mid = (l + r) // 2
            if LIST[mid] < x:
                l = mid +1
            else:
                r = mid
        return l

1)该方法图解见下图:

图2 方法二图解(图源@花花酱) 

简而言之,按顺序判断数组每个元素,如果该元素大于已加入的所有元素,则直接append到LIST数组结尾,反之替换数组中不影响数组长度的最大元素。举例说明,如上图,遍历至5,可替换上一步加入的8且数组长度依然为3。

2)使用了二分查找寻找遍历到的当前元素应该插入的位置。

        def bisect_left(self, LIST, x):

                l, r = 0, len(LIST)

                while l < r:

                        mid = (l + r) // 2

                        if LIST[mid] < x:

                                l = mid +1

                        else:

                                r = mid

                return l

关于 bisect_left和bisect_right等的具体实现算法及区别见下方:

        bisect_left,bisect_right,bisect的用法,区别以源码分析_bisect_right(arr,arr[i]+k,i)-CSDN博客

标签:nums,Python,元素,LIST,mid,len,300,Subsequence,bisect
From: https://blog.csdn.net/m0_45175452/article/details/137405704

相关文章

  • Python环境下基于离散小波变换的信号降噪方法
    Mallat创造了小波分析中的经典理论之一,即多分辨率分析的概念。后来,在Mallat与Meyer的共同努力之下,他们又在这一理论的基础上发明了离散小波变换的快速算法,这就是Mallat塔式算法,这种算法可以大量减少计算时间。在之前的二十年之间,小波分析方法在自身不断发展壮大的同时,也被许多......
  • 在Python中用concurrent.futures创建线程池进程池
    简介Python3.2带来了concurrent.futures模块,借此能够快速使用线程池和进程池。对于不需要控制优先级与资源分配的多任务,使用concurrent.futures模块快捷优雅。示例代码与效果importconcurrent.futuresimporttimedefa_task(x):"""模拟一个耗时的任务"""de......
  • Python程序设计 魔法函数
    1.魔法方法Python中有一些特殊方法,它们允许我们的类和Python更好地集成。在标准库参考(StandardLibraryReference)中,它们被称为魔法方法(MagicMethods),是与Python的其他特性无缝集成的基础。例如,我们用字符串来表示一个对象的值。Object 基类包含了__repr__() 和__str__()......
  • Python程序设计 垃圾回收机制&鸭子类型
    1.简介引用计数(python默认):记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收标记清除:第一段给所有活动对象标记,第二段清除非活动对象分代回收:python将内存根据对象的存......
  • Python|梯度下降法
    全量梯度下降importnumpyasnp#创建数据集X,ynp.random.seed(1)X=np.random.rand(100,1)y=4+3*X+np.random.randn(100,1)X_b=np.c_[np.ones((100,1)),X]#创建超参数n_iterations=10000t0,t1=5,500#定义一个函数来动态调整学习率defl......
  • 小白学python爬虫1
    """爬虫:通过编写程序来获取互联网上的资源需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或者内容"""#fromurllib.requestimporturlopen#url网址##url="http://www.baidu.com"#resp=urlopen(url)###print(resp.read().decode("utf-8"))......
  • Python栈和队列
    在计算机科学中,栈(Stack)和队列(Queue)是两种非常重要的数据结构,它们在算法设计和程序开发中扮演着关键角色。Python语言内置了对这两种数据结构的支持,尤其是在其`collections`和`deque`模块中。###栈(Stack)栈是一种后进先出(LastInFirstOut,LIFO)的数据结构,它只允许在一端进行......
  • Python简单函数循环综合实例
    importrandomprint("*"*71)print("*"*27+"欢迎来到名人猜猜猜"+"*"*27)print("*"*29+"Let'sbegining"+"*"*28)character_1='他是巨星'character_2='他是篮球健将'character_3='他身......
  • Python递归调用应用实例-汉诺塔
    递归介绍1.简单的说:递归就是函数自己调用自己,每次调用时传入不同的值2.递归有助于编程者解决复杂问题,同时可以让代码变得简洁汉诺塔传说汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石住子,在一根柱子上从上往下按照大小顺......
  • 10个全面了解python自动化办公代码
    10个全面了解python自动化办公代码当涉及自动化工作时,Python是一种非常强大的编程语言.以下是10个用于自动化工作的Python代码示例:文件操作:自动化文件操作可以帮助您批量处理文件、筛选内容等等. import os# 遍历目录下所有文件for root, dirs, files in ......