题目:
给定一个没有排好序的数组,求一个其递增的子序列,返回长度。
使用O(nlogn)的解法。
解题思路:
一般来说,要求使用O(nlogn)时间复杂度的,首先想到二分查找,设置一个非递减的数组。
具体思路看下面的例子。
代码:
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int[] min = new int[nums.length + 1];
min[0] = Integer.MIN_VALUE;
for (int i = 1; i < min.length; ++i) {
min[i] = Integer.MAX_VALUE;
}
for (int i = 0; i < nums.length; ++i) {
int index = binarySearch(min, nums[i]);
min[index] = nums[i];
}
for (int i = nums.length; i >= 1; --i) {
if (min[i] != Integer.MAX_VALUE) {
return i;
}
}
return 0;
}
//找到大于num的第一个数下标
private int binarySearch(int[] minLast, int num) {
int start =0;
int end = minLast.length - 1;
int mid;
while (start + 1 < end) {
mid = start + ((end - start) >> 1);
if (minLast[mid] < num) {
start = mid;
} else {
end = mid;
}
}
if (minLast[start] > num) {
return start;
}
return end;
}
-----------EOF----------