首页 > 编程语言 >Python中最长的递增序列

Python中最长的递增序列

时间:2023-09-20 16:24:43浏览次数:37  
标签:nums Python 递增 list 数组 序列 101 我们

如何使用Python中的N平方法和二进制搜索法计算一个数组中最长的递增子序列。

使用N平方法计算最长的递增子序列

在Python社区中,有一个著名的问题是关于最长递增子序列的,在不同的面试中也会被问到。这是一个Leetcode ,问题说:给定一个未排序的整数数组,找出该数组的最长递增子序列或子集的长度。

一个子集就像一个数组的短数组;每个数组可以有多个子集。另一件事是子数组将是这个[10,9,2,5,3,7,101,18] 数组中的一些元素,但以连续的子序列方式。

它可以像[2, 3, 5, 7] ,但不能像[2,3,101] ,所以在讨论子数组时不需要打破顺序。而且,在子序列中,元素在数组中出现的顺序必须是相同的,但可以是任何一个个体。

例如,在这种情况下,我们可以看到,答案是[2, 3, 7,101] ;5 ,但这是可以的,因为它是一个子序列。

如果我们看到从[10,9,2,5,3,7,101,18] 开始的最长的递增子序列,我们会发现[2, 5, 7, 101] ;这也可能意味着一个答案,但答案也可能是[2, 3, 7, 101] ,这也是我们的另一个子序列。[3, 7, 101] 也是一个子序列,但这不是最长的,所以我们不考虑它。

可能有不止一个组合;正如我们刚刚看到的,我们只需要返回长度。

通过这个例子,我们可以很容易地想到一个递归的解决方案,从零索引开始,沿着所有不同的路径进行。使用这个数组[0,3,1,6,2,2,7] ,我们可以采取,例如,用0 ,我们可以转到3 ,或者我们可以转到1 ,或者转到6 。

然后,从这一点开始,递归地继续下去。看看下面的例子,哪条路径最长,会是指数级的;我们很容易想到必须要有一些动态编程的方法。

所以,我们有一个数组,每个索引至少有一个长度。

[0,3,1,6,2,2,7]
[1,1,1,1,1,1,1]

我们将从第一个索引开始,0 ,其长度是1 ,但有了3 ,我们可以看后面,如果3 大于0 ,那么3 有2 的长度。如果我们再以1 ,我们将在当前索引之前的所有索引后面寻找。

从零索引中,我们可以看到1 大于0 ,但1 不大于3 ,所以在这一点上,我们要计算0 和1 ,其长度将是2 。

[0,3,1,6,2,2,7]
[1,2,2,1,1,1,1]

在考虑6 ,让我们从后面开始看,我们知道6 大于[0,1] 或[0,3] ,包括6 ,其长度将是3 ,然后也是2 的长度是3 ,以此类推,这是一个平方的方法。

[0,3,1,6,2,2,7]
[1,2,2,3,3,...]

时间复杂度和空间复杂度

让我们跳入代码,创建我们的类,称为CalculateSubSequence ;在lengthOfLIS 函数里面,我们初始化我们的nums_list 变量为nums 的长度,这个数组将只有1次。

在嵌套循环里面,我们将检查该值是否大于我们要检查的数字。然后,让我们把我们的nums_list 的i ,我们将更新nums_list 的值,同时使用最大值 nums_list[i].

i 在外循环的迭代之后,对于 nums_list[j],j 是在内循环迭代后产生的,然后我们将其添加到1 中。最后,我们将返回nums_list 的最大值。

class CalculateSubSequence:
    def lengthOfLIS(self, nums: list[int]) -> int:
        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]:
                    nums_list[i] = max(nums_list[i], nums_list[j] + 1)
        return max(nums_list)
sbs = CalculateSubSequence()
sbs.lengthOfLIS([0,3,1,6,2,2,7])

这里的时间复杂度将是n 的平方,而空间复杂度将是o 的n 。

4

上面的解决方案已经足够了,但是另一种方法,n log ,使用二进制搜索到我们的临时数组的左边,使用bisect_left 。

from bisect import bisect_left
#Python小白学习交流群:153708845
class CalculateSubSequence:
    def lengthOfLIS(self, nums: list[int]) -> int:
        n= len(nums)
        tmp=[nums[0]]
        for n in nums:
            x = bisect_left(tmp,n)
            if x ==len(tmp):
                tmp.append(n)
            elif tmp[x]>n:
                tmp[x]=n
        return len(tmp)
sbs = CalculateSubSequence()
sbs.lengthOfLIS([0,3,1,6,2,2,7])

输出:

4

标签:nums,Python,递增,list,数组,序列,101,我们
From: https://www.cnblogs.com/xxpythonxx/p/17717656.html

相关文章

  • Python模拟函数
    unittest.mock或Mock函数是一个用于Python测试的库,它允许你用mock对象替换被测系统的部件,并对这些部件的使用情况作出断言。unittest.mock给出了一个核心的Mock类,消除了在你的测试套件中创建大量存根的必要性。在执行一个过程后,你可以断言哪些方法或属性被使用,以及它们被调......
  • python:面向对象编程
    python:面向对象编程一、面向对象的编程思想1、面向过程与面向对象面向过程:自顶向下,逐步细化(各个功能的实现=>函数的封装)核心:函数把一个系统分解为若干个步骤,每个步骤都是一个函数所谓的面向对象,就是在编程的时候尽可能的去模拟现实世界。在现实世界中,任何一个操作或业......
  • Python 获取控制台输入的值
    获取控制台输入参数if__name__=='__main__':while1:question=input('用户:')answer="你的问题是:"+questionprint('VipQA',answer)......
  • Sql Server分组排序及生成序列号
    1--1.分组排序2SELECT*,ROW_NUMBER()OVER(PARTITIONBY@fileName,@fileName1ORDERBYIDDESC)ASrowNumFROM@tableName34--2.生成序列号5SELECT*,ROW_NUMBER()over(orderbyidASC)ASrowNumFROM@tableName 翻译搜索复制......
  • CentOS 7.9编译安装Python-3.10.13
    一、查看CentOS版本、系统默认gcc版本、Python版本和pip版本:#cat/etc/redhat-release#gcc--version#python-V#pip-V二、部署Python-3.10.13:1、下载Python-3.10.13.tar.xz,Python官网:https://www.python.org/2、安装编译依赖软件包及包组:#yum-ygroupinstall"Development......
  • Python 运算符
    1.算数运算符运算符描述实例+加1+1输出结果:2-减1-1输出结果:0*乘2*2输出结果:4/除10/2输出结果:5//取整9//4输出结果:2%取余9%4输出结果:1**指数2**4输出结果:16()小括号优先运算:(1+2)*2结果:6注意:混合......
  • 软件测试|探索Python中获取最高数值的几种方法
    前言在数据分析、统计和编程领域,经常会遇到需要从一组数值中找出最高数值的情况。Python作为一门功能丰富的编程语言,提供了多种方法来实现这一目标。在本文中,我们将探索几种获取最高数值的方法,帮助大家在不同情况下选择最适合的方法。使用max()内置函数Python内置了max()函数,它......
  • 软件测试|Python中如何控制输出小数点位数
    简介在数据处理、科学计算和金融分析等领域,经常需要对浮点数的输出进行格式化,以控制小数点后的位数。Python提供了多种方法来实现这个目标。在本文中,我们将深入探讨几种指定输出小数点位数的方法,帮助我们在不同场景下选择合适的方式。使用字符串格式化Python的字符串格式化功能非常......
  • 软件测试|Python如何将列表从大到小排序
    简介在编程中,对列表进行排序是一个常见的操作,有时候我们需要将列表按照从大到小的顺序进行排列。Python提供了多种方法来实现这一目标。在本文中,我们将深入探讨几种将列表从大到小排序的方法,帮助您根据不同情况选择最合适的方式。使用sorted()函数Python的sorted()函数可以接收一......
  • Python异步编程高并发执行爬虫采集,用回调函数解析响应
    一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文件等操作。这这些操作,通常90%以上时间是在等待,如通过REST,gRPC向服务器发送请......