leetcode Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence.
For example, Given
[10, 9, 2, 5, 3, 7, 101, 18]
, The longest increasing subsequence is[2, 3, 7, 101]
, therefore the length is4
. Note that 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?
题目地址:leetcode Longest Increasing Subsequence
题意
给定一个数组,求最长上升子序列。
思路
方法一:
dp[i] 为 以 A[i]结尾的LIS,那么对于dp[i]有dp[i] =max( dp[j] + 1) [ 0<= j < i, nums[j] < nums[i] ]
效率为O(n^2)
方法二:
dp[i] 为 以 A[i]结尾的LIS , g(i) = min ( A[j]) ( dp[j] = i) 即g(i)表示上升子序列为i,结尾最小的值。
比如,1,2,4,3中A[3] = 3
那么显然, g(1) <= g(2) <=……g(n)
我们可以用二分搜索查找满足g(k) >= A[i]的第一个下标k,则dp[i] = k ,此时 A[i] <= g(k) , 而dp[i] =k,所以更新g(k) = A[i]
python O(n^2)
1 | class Solution(object): |
python O(nlogn)
1 | class Solution(object): |