最长上升子序列问题
1、动态规划,时间复杂度为O(n^2)
用 d(i)表示从0到i时的最长上升子序列的长度,动态转移方程为d(i)=max{d(j)} + 1,其中0<=j<0并且nums[i] > nums[j]。伪代码如下
function LIS()
ans = 0
d[0]=1
for i in 1 to n
maxVal = 0
for j in 0 to i - 1
if nums[i] > nums[j]
maxVal = max(maxVal, d[j])
d[i] = maxVal + 1
ans = max(ans, d[i])
return ans
2、动态规划+二分法,时间复杂度为O(nlgn)
用d(i)表示长度为i时,d(i)的值是最小值(在长度有多种情况时)。伪代码如下
function LIS()
d[0]=-INF
len = 0
for num in nums
if num > d[len]
d[++len] = num
else
pos = upper_bound(d + 1, d + len+1, num) - d
d[pos] = num
return len
3、基于数据结构的O(nlgn)算法,线段树或者Fenwich树(BIT)