随笔

Leetcode 300. 最长上升子序列

2019-06-11  本文已影响0人  zhipingChen

题目描述

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

示例 1:

输入: [10,9,2,5,3,7,101,18]

输出: 4

解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

动态规划

申请等长的临时数组 arr,用于保存每个位置上对应的最长上升序列长度,则计算 arr[i] 时,需要遍历前 i 个位置,取 nums 值小于 nums[i] 的最大序列长度加一,即为 arr[i] 的值。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        length=len(nums)
        arr=[1]*length
        for i in range(1,length):
            for j in range(i):
                if nums[i]>nums[j]:
                    arr[i]=max(arr[i],arr[j]+1)
        return 0 if length==0 else max(arr)

动态规划+二分法

申请临时数组用于保存上升序列,遍历 nums 数组元素,若元素大于临时数组最大值,则直接添加进临时数组;否则将临时数组中适当位置处元素更新为该元素。

二分法计算元素位置,得到的临时数组位置上的值必然大于该新元素,更新元素值,即将元素值变小,并不影响后续的 nums 数组遍历。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums:
            return 0
        arr=[nums[0]]
        for e in nums[1:]:
            if e>arr[-1]:
                arr.append(e)
                continue
            l,r=0,len(arr)-1
            while l<=r:
                middle=l+(r-l)//2
                if arr[middle]<e:
                    l+=1
                elif arr[middle]>e:
                    r-=1
                else:
                    break
            if l>r:
                arr[l]=e
        return len(arr)
上一篇下一篇

猜你喜欢

热点阅读