Skip to content

Latest commit

 

History

History
58 lines (55 loc) · 1.74 KB

300.longest-increasing-subsequence.md

File metadata and controls

58 lines (55 loc) · 1.74 KB

题目地址

https://leetcode-cn.com/problems/longest-increasing-subsequence/

题目描述

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

Input: [10,9,2,5,3,7,101,18]
Output: 4 
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. 
Note:

There may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?

思路

方法一:动态规划

  • 维护一个记录最大值的数据队列DP
  • 时间复杂度O(n2)
  • 空间复杂度O(n),额外维护了一个队列
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums:
            return 0
        dp = [1]*len(nums)
        for i in range(len(nums)):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j]+1)
        return max(dp)

方法二:贪心加二分查找

  • 维护一个上升子序列
  • 时间复杂度O(n log n),循环一次为n,然后二分查找为log n
  • 空间复杂度O(n),维护一个数列
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        d = []
        for n in nums:
            if not d or n > d[-1]:
                d.append(n)
            else:
                l, r = 0, len(d) - 1
                loc = r
                while l <= r:
                    mid = (l + r) // 2
                    if d[mid] >= n:
                        loc = mid
                        r = mid - 1
                    else:
                        l = mid + 1
                d[loc] = n
        return len(d)