用 java 刷的第一个题
这里一片英文 反正题目意思是求最长上升子序列....
有四个样例
Sample Input
4
6
4 2 6 3 1 5
10
2 3 4 5 6 7 8 9 10 1
8
8 7 6 5 4 3 2 1
9
5 8 9 2 3 1 7 4 6
Sample Output
3
9
1
4
一般求解(此处超时):
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int ncase = in.nextInt();
while(ncase-- > 0) {
int n = in.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
int[] dp = new int[n];
int ans = 0;
dp[0] = 1;
for(int i = 1; i < n; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++) {
if(a[i] > a[j]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
ans = Math.max(ans, dp[i]);
}
System.out.println(ans);
}
}
}
反正是超时
法2:
是以前在牛客网上面看的视频 二分
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int ncase = in.nextInt();
while(ncase-- > 0) {
int n = in.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
int[] h = new int[n]; //h 是一个有序的数组
// h[i]是指假设当前遍历到 某个数为止 长度为 i+1 的最长递增子序列的 最小末尾
h[0] = a[0];
int ans = 0; // h 数组中最后一个元素的下标
for(int i = 1; i < n; i++) {
//在有序数组中找到第一个大于 a[i] !!!
//找到就替换 没找到就扩充 h
int l = 0, r = ans;
while(l <= r) {
int m = l + (r-l) / 2;
if(h[m] >= a[i]) {
r = m - 1;
}
else l = m + 1;
}
ans = Math.max(ans, l);
h[l] = a[i];
}
System.out.println(ans+1);
}
}
}
只是做一个题 学到还挺多的
1、提交时类名必须是Main
2、不能把类所在的那个包给提交进去
3、用二分在数组中找到第一个大于某个数的数的下标
4、一直输到文件尾
Scanner in = new Scanner(System.in);
while(in.hasNext()){
}