效率n*n:
a[]存放需要处理的数,n是a[]长度-1
- static int LIS(int a[], int n)
- {
- int i, j;
- int ans = 1;
- int m = 0;
- int[] dp = new int[n + 1];
- dp[0] = 1;
- for (i = 1; i <= n; i++) {
- m = 0;
- for (j = 0; j < i; j++) {
- if (dp[j] > m && a[j] < a[i]) {
- m = dp[j];
- }
- }
- dp[i] = m + 1;
- if (dp[i] > ans)
- ans = dp[i];
- }
- return ans;
- }
效率nlogn
import java.util.Scanner;
public class Main {
//arr[]存放数
public static void main(String[] args) {
int len, index;
int[] dp = null, arr = null;
Scanner in= new Scanner(System.in);
while (in.hasNext()) {
int T = in.nextInt();
for (int k = 0; k < T; k++) {
len = 0;
int n = in.nextInt();
dp = new int[n + 1];
arr = new int[n+ 1];
for (int j = 1; j <= n; j++) {
arr[j] = in.nextInt();
}
dp[++len] = arr[1];
for (int j = 2; j <= n; j++) {
if (arr[j] > dp[len]) {
dp[++len] = arr[j];
}
index = search(dp, arr[j], 1, len);
dp[index] = arr[j];
}
System.out.println(len);
}
}
}
private static int search(int[] dp, int value, int start, int end) {
int mid;
while (start < end) {
mid = (start + end) / 2;
if (dp[mid] > value) {
end = mid;
} else {
start = mid + 1;
}
}
return start;
}
}