题目
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,所以令dp数组初始化为1.
状态dp[i]:表示数组中以nums[i]结尾的元素最长递增子序列长度.
状态转移方程:dp[i] = max(dp[i],dp[j]+1)
其中j表示在i之前的元素,dp[j]+1表示之前某个序列的长度加nums[i]元素的最长长度。
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [1 for i in range(len(nums))]
for i in range(len(nums)):
for j in range(0,i):
if nums[i]>nums[j]:
dp[i] = max(dp[i],dp[j]+1)
res = 0
for i in range(len(dp)):
res = max(res,dp[i])
return res
时间复杂度为O(n^2),空间复杂度为O(n)。
二分法
具体思路可参考纸牌游戏,一般不容易想到,可了解。
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
top = [0] * len(nums)
pice = 0
for i in range(len(nums)):
p = nums[i]
l,r = 0,pice
while l < r:
mid = (l+r)//2
if p == top[mid]:
r = mid
elif p>top[mid]:
l = mid +1
elif p< top[mid]:
r = mid
if l == pice:
pice += 1
top[l] = p
return pice
时间复杂度为O(nlogn),空间复杂度为O(n).