版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
【LeetCode】300. Longest Increasing Subsequence 解题报告(Python)
题目地址:https://leetcode.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?
解法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)
解法二:贪心算法+二分查找
具体思想可参考 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