标签:tail bin nod port index 多个 nlog i++ ann
给出长度为 N 的数组,找出这个数组的最长递增子序列。递增子序列是指,子序列的元素是递增的。
例如:5 1 6 8 2 4 5 10,最长递增子序列是 1 2 4 5 10
import java.util.Scanner;
/**
* 定义ans[k]为长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。
*
* 首先len = 1,ans[1] = array[1]
* 遍历array[i],若array[i]>ans[len],那么ans[++len] = array[i]
* 否则,我们要从ans[1]到ans[len-1]中找到一个j,满足ans[j-1]<array[i]<=ans[j]
*
* 则根据ans的定义,我们需要更新长度为j的上升子序列的最末元素(使之为最小的)即 ans[j] = array[i]
*
* 最终答案就是len
*
* ans中元素是单调递增的,利用这个特性,在查找j的时候可以二分查找,从而时间复杂度为O(nlogn)
*
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] array = new int[n];
for (int i = 0; i < n; i++)
array[i] = scanner.nextInt();
int[] ans = new int[n + 1];
ans[1] = array[0];
int len = 1;
for (int i = 1; i < n; i++) {
if (array[i] > ans[len]) {
ans[++len] = array[i];
} else {
int pos = binarySearch(array, i, ans, len);
ans[pos] = array[i];
}
}
System.out.println(len);
}
public static int binarySearch(int[] array, int index, int[] ans, int len) {
int left = 1, right = len, mid;
while (left < right) {
mid = (left + right) >> 1;
if (ans[mid] >= array[index])
right = mid;
else
left = mid + 1;
}
return left;
}
}
标签:tail bin nod port index 多个 nlog i++ ann
原文地址:https://www.cnblogs.com/debugxw/p/11335464.html