前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 300. 最长上升子序列

Leetcode 300. 最长上升子序列

作者头像
zhipingChen
发布2019-06-15 14:26:31
5210
发布2019-06-15 14:26:31
举报
文章被收录于专栏:编程理解编程理解

题目描述

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

示例 1:

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

输出: 4

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

动态规划

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

代码语言:javascript
复制
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 数组遍历。

代码语言:javascript
复制
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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档