[LeetCode] (300) 가장 긴은 서브 시퀀스 문제 해결 보고서 (파이썬) 증가

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/ttinch/article/details/102673387

[LeetCode] (300) 가장 긴은 서브 시퀀스 문제 해결 보고서 (파이썬) 증가

주제 주소 : https://leetcode.com/problems/longest-increasing-subsequence/

제목 설명

정수의 정렬되지 않은 배열을 지정해, 긴 증가 시퀀스의 길이를 찾을 수 있습니다.

예:

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. 

노트 :

  • 당신이 길이를 반환하는 것이에만 필요 하나 개 이상의 LIS 조합이있을 수 있습니다.
  • 귀하의 알고리즘의 O (N2)의 복잡성을 실행해야합니다.

후속 : 당신이 O를 ​​향상시킬 수있는 시간 복잡도 (N 로그 n)?

해결 방법 1 : 동적 프로그래밍

[ 나는 ] = a x ( d p [ j ] + 1 , 1 ) DP [I] = 최대 (DP [J] + 1,1) , 이는 j < i J <I n u m s [ j ] < n u m s [ i ] nums [J] <nums [I]
알고리즘 복잡도가 O ( n 2 ) O (n ^ {2})

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

해결 방법 2 : + 이진 검색 욕심 알고리즘

특정 아이디어를 참조 할 수 있습니다 https://blog.csdn.net/lw_power/article/details/80758674

복잡성 O ( n l o g n ) O (nlogn) :

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums:
            return 0
        tail = nums[0:1]
        for i in range(1, len(nums)):
            if nums[i] > tail[-1]:
                tail.append(nums[i])
            else:
                position = self.binarySearch(tail, nums[i])
                tail[position] = nums[i]
        return len(tail)

    # 查找nums中第一个比n大的元素
    def binarySearch(self, nums: List[int], n: int) -> int:
        # print(nums, n)
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left+right)//2
            if nums[mid] == n:
                return mid
            elif nums[mid] > n:
                right = mid
            else:
                left = mid + 1
        if left == right:
            mid = left
        return mid

추천

출처blog.csdn.net/ttinch/article/details/102673387