版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本题目要求读入n个整数,要求用最少的比较次数,输出它们的最小值和次小值。例如,对于12 13 1 10 34 1这6个数,最小值为1,次小值为10。
时间限制: 200 ms
内存限制: 64 MB
代码长度限制: 16 KB
输入格式:
输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n个以空格分隔的整数。
输出格式:
对每一组输入,在一行中输出最小值和次小值,中间以一个空格分隔,但行尾没有多余空格。如果输入数据不足两个,则输出“Invalid Input”。如果没有次小值,则输出“There is no second smallest element”。
输入样例:
6
12 13 1 10 34 1
输出样例:
1 10
代码如下(有局限性,只适用于全部为非负整数的情况,当数的个数大于1 000 000时运行时间超200ms,代码仅供参考)
import java.io.*;
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if(n<2)
System.out.println("Invalid Input");
else {
String Str = br.readLine();
String[] s = Str.split(" ");
int[] num = new int[1000000];
for(int i=0;i<n;i++) {
int tmp = Integer.parseInt(s[i]);
num[tmp]+=1;
}
int min1=-1,min2=-1;
int i=0;
for(;i<1000000;i++) {
if(num[i]!=0) {
min1 = i;
break;
}
}
for(i=i+1;i<1000000;i++) {
if(num[i]!=0) {
min2 = i;
break;
}
}
if(min2==-1) {
System.out.println("There is no second smallest element");
}
else {
System.out.println(min1+" "+min2);
}
}
}
}