最长递增子序列(Longest Increasing Subsequence)

三种做法:

  1. 排序+LCS算法
  2. DP O(n2)
  3. 各位最小值序列 O(nlogn)

下面解释序列各位最小值列表

假设存在一个序列d[1…9] = 2 1 5 3 6 4 8 9 7
手工列出可能的最长子序列:
2 5 6 7
2 5 6 8 9
1 3 4 7
1 3 4 8 9
5 6 8 9
5 6 7
那么,各位最小值序列为
1 3 4 7 9
那么最长的序列的长度为5, 显然为1 3 4 8 9。那么, 7 是因为存在序列
1 3 4 7,它在长度大于4的序列中,位置4上的值最小。

分析可以发现,最长递增子序列和各位最小值序列有如下特点:
1) 长度相同
2) 各位最小值序列的每个值都小于等于最长递增子序列的值。
3) 各位最小值序列是虚拟的序列。

也就是说,只要我们生成各位最小值列表,也就计算出了最长递增子序列的长度。

生成各位最小值序列步骤:
不妨设输入序列为a, 最小值序列为b。
1) b[0] = a[0], 记录b的长度为len=1(序列a长度必须大于1)
2) 遍历序列a剩余元素,a[i],
如果a[i] < b[0], b[0] = a[i];
如果b[len-1] < a[i],b[len ++] = a[i];
如果 b[0] < a[i] && a[i] < b[len-1],那么,【问题转化为找到序列b中第一个大于等于a[i]的元素】, 不妨设,该元素下标为key, 那么
b[key] = nums[i];

你可能感兴趣的:(coding)