最长递增子序列问题,O(N*logN)实现

来源:互联网 发布:百纳科技源码 编辑:程序博客网 时间:2024/06/05 18:18

最长递增子序列的长度问题,O(N*logN)实现


子序列:可以不连续的

例如:2,1,3,4,7,5,6  

上述序列的最长递增子序列是1,3,4,5,6或者2,3,4,5,6


一般方法:

number : 2 3 1 7 4 5

index:  0 1 2 3 4 5

len[]:  1 2 1 3 3 4

第一个len[0]是1

之后每一个number[i]查看number[0至(i-1)],如果number值比它小,

那么len[i]为它+1(当然更新发生在它比len[i]大的情况下)

过一遍之后,len[n-1]即为所求。

则时间复杂度为O(n*n)


n*logn算法:

 2 1 3 4 7 5 6

      

min_ends(最小结尾数组):

分为有效区和无效区[有效区|无效区]

当你遍历到一个值的时候,如果此时此值在有效区,

ends[i]:代表所有长度为i+1的最长递增子序列中最小结尾就是i的值

如果在无效区,则没有意义。

     2 1 3 4 7 5 6

ends   2

ends   1 

ends   1 3

ends   1 3 4

ends   1 3 4 7

ends   1 3 4 5

ends   1 3 4 5 6


index  0 1 2 3 4 5 6 

遍历时,在有效区二分查找,找到第一个比它大的数,

如果找到,则更新大的数为当前值,

如果没有找到,则直接填写此值。








原创粉丝点击