求最小值和次小值(Java)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/l870358133/article/details/102467707

本题目要求读入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);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/l870358133/article/details/102467707