면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
[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 : 동적 프로그래밍
, 이는
且
알고리즘 복잡도가
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
복잡성 :
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