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

2021-03-17 06:27

阅读:674

标签:com   col   color   python   大于   image   pretty   print   sha   

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

示例:
输入: [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 技术图片
每个位置上的数都与他后面的一一比较,直到找到一个大于他的数或者一直比较到结束也没有找到比他大的数。
如果一直到结束也没有比他大的数,那这个位置的最大上升序列记为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] [j]:
                    if nums_01[i] [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 [i]:
                ans = nums_01[i]
        return ans

 

 

技术图片

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

标签:com   col   color   python   大于   image   pretty   print   sha   

原文地址:https://www.cnblogs.com/336699qiangqiang/p/13983461.html


评论


亲,登录后才可以留言!