题目:《编程之美》 P194
写一个时间复杂度尽可能低的程序,求一个数组(length个元素)中最长递增子序列的长度。
注意,本题认为最长递增子序列可以有相等的元素,如 (1,2,2,3,3,4,5,6)。
时间复杂度为O(n^2)的程序思路很简单,参考书上的解法一。针对O(n^2)的解法进行改进,利用有序数组的二分查找,可以使得时间复杂度降低。本题的难点在于,建立一个长度为length+1的数组MinV,MinV[i]代表着长度为i的递增子序列最大元素的最小值。而且数组MinV是升序的,理解这一点尤其关键。
以下是时间复杂度为O(nlogn)的代码:
<