渣渣的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

 

 

在这里插入图片描述

posted @ 2020-11-16 09:07  336699强强  阅读(130)  评论(0编辑  收藏  举报