渣渣的Leetcode之旅(Python3)_300.最长上升子序列

Posted 336699强强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渣渣的Leetcode之旅(Python3)_300.最长上升子序列相关的知识,希望对你有一定的参考价值。

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

注意:
如果输入[]的话,自然输出0
如果输入[1]或者[2]之类包含一个值的输入,应该输出1,一开始我以为是也是输出0,看了半天

方法1:
暴力,将每一位上的数字与在它后面的所有数字一一比较。
技术图片

技术图片
这么做思路清晰简单,但大概率会超时。

方法2:
动态规划,具体思路参考:https://blog.csdn.net/qq_38175040/article/details/109468948
从末端开始,依次向前遍历。每个位置上的最长上升序列都记录下来。(最后一位为1)
技术图片
4 < 8
技术图片
每个位置上的数都与他后面的一一比较,直到找到一个大于他的数或者一直比较到结束也没有找到比他大的数。
如果一直到结束也没有比他大的数,那这个位置的最大上升序列记为1,参考76,67两个位置上以及最后一个位置上的数字。
技术图片

如果找到比他大的数,此位置的最大上升子序列为那个位置的记录加上1,如下图:
技术图片

技术图片
以此类推,直到:
技术图片

求得最大上升子序列的长度为4。

本题代码如下:

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        ans = 0
        if len(nums) == 0:
            return 0
        nums_01 = [0]*len(nums)
        middle = 0
        nums_01[len(nums)-1] = 1

        for i in range(len(nums)-2,-1,-1):  #从数组nums的倒数第二位遍历到nums[0]为止
            for j in range(i+1,len(nums)):  
                if nums[i] < nums[j]:
                    if nums_01[i] < nums_01[j] + 1:
                        nums_01[i] = nums_01[j] + 1
                        middle = 1
            if middle == 0:
                nums_01[i] = 1
            else :
                middle = 0 


        for i in range(len(nums)):
            if ans < nums_01[i]:
                ans = nums_01[i]
        return ans

 

 

技术图片




















以上是关于渣渣的Leetcode之旅(Python3)_300.最长上升子序列的主要内容,如果未能解决你的问题,请参考以下文章

二本渣渣的辛酸面试之路:5面阿里过后侥幸收获Offer,定级P6+

工作小记

使用正则表达式的疑问

Shader做剪影效果

zookeeper学习(零)_安装与启动

python3实现合并两个有序数组