【JAVA】PAT 乙级 1045 快速排序(样例1、3、4、5超时)
题目链接
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?
例如给定 N = 5 N = 5 N=5, 排列是1、3、2、4、5。则:
1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
类似原因,4 和 5 都可能是主元。
因此,有 3 个元素可能是主元。
输入格式:
输入在第 1 行中给出一个正整数 N(≤105 ); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 109 。
输出格式:
在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5
1 3 2 4 5
输出样例:
3
1 4 5
一开始写了只有一个样例通过了,其他全都超时
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int n = sti(bf.readLine());
int[] a = stii(bf.readLine());
int[] b = a.clone();
Arrays.sort(b);
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
b[i] = 0;
}
}
Arrays.sort(b);
int count = 0;
String r = "";
for (int i = 0; i < b.length; i++) {
if (b[i] == 0) {
continue;
}
r += b[i] + " ";
count++;
}
out.println(count);
out.println(r.trim());
out.flush();
}
static int sti(String a) {
return Integer.parseInt(a);
}
static int[] stii(String a) {
String[] ra = a.split(" ");
int[] r = new int[ra.length];
for (int i = 0; i < r.length; i++) {
r[i] = sti(ra[i]);
}
return r;
}
}
后来参考了下柳婼的代码,改写了写成了JAVA,然后样例2也通过了,但是1、3、4、5还是超时…
大家如果有办法欢迎在评论区留言讨论
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
StreamTokenizer in = new StreamTokenizer(bf);
in.nextToken();
int n = (int) in.nval;
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
in.nextToken();
a[i] = (int) in.nval;
b[i] = a[i];
}
Arrays.sort(a);
ArrayList<Integer> r = new ArrayList<Integer>();
int max = 0;
for (int i = 0; i < n; i++) {
if (a[i] == b[i] && b[i] > max) {
r.add(b[i]);
}
if (b[i] > max) {
max = b[i];
}
}
out.println(r.size());
int count = 0;
for (int tem : r) {
if (count == 0) {
out.print(tem);
} else {
out.print(" " + tem);
}
count++;
}
out.println();
out.flush();
}
}