longest increasing subsequence nlogn 算法

O(n^2)

算法逻辑:贪心 + 二分搜索

数据定义补充:
开一个栈,将a[0]入栈,每次取栈顶元素top和读到的元素ai做比较,如果a[i]> top 则将a[i]入栈;如果a[i]<= top则二分查找栈中的比a[i]大的第1个数,并用a[i]替换它。 最长序列长度即为栈的大小top。

这是很好理解的,对于x和y,如果x < y且stack[y] < stack[x],用stack[x]替换stack[y],此时的最长序列长度没有改变,但序列继续变长的''潜力''增大了。
举例:原序列为1,5,8,3,6,7
开始1,5,8相继入栈,此时读到3,用3替换5,得到1,3,8;
再读6,用6替换8,得到1,3,6;
再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。

你可能感兴趣的:(longest increasing subsequence nlogn 算法)