到了小Q丧心病狂的卫生间思考时间:
题目:小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
示例1
输入
6 45 12 45 32 5 6
输出
1 2
思路:1.首先进行数字排序,若最大值等于最小值,则最大对数=最小对数=n*(n-1)/2
2.用map统计数组中每种数字的个数
3.计算差最小的个数
如果数组中没有重复数字,说明最小差不为0,最小差肯定是数组中相邻两个数的差,因此遍历数组,统计最小差。
如果数组中有重复数字,说明最小差为0,最小差肯定是数组中相邻两个数的差,因此,遍历一遍数组,并统计最小差。
4.计算差最大的个数
只有一种情况,即最大值和最小值的两两组合,故为最大值个数*最小值个数
目前搜集到的一个代码:
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Scanner; 6 import java.util.TreeMap; 7 8 public class Main { 9 10 public static void main(String[] args) { 11 Scanner sc = new Scanner(System.in); 12 while(sc.hasNext()){ 13 int n = sc.nextInt(); 14 int[] a = new int[n]; 15 for(int i=0;i<n;i++){ 16 a[i] = sc.nextInt(); 17 } 18 19 Arrays.sort(a); 20 //如果数组中的值全相同,直接两两组合 21 if(a[0] == a[n-1]){ 22 int tmp = (n*(n-1))/2; 23 System.out.println(tmp + " " + tmp); 24 continue; 25 } 26 //map用来统计 27 Map<Integer, Integer> map = new TreeMap<Integer, Integer>(); 28 for(int i=0;i<n;i++){ 29 if(map.containsKey(a[i])) 30 map.put(a[i], map.get(a[i])+1); 31 else 32 map.put(a[i], 1); 33 } 34 //求差最小个数 35 int minres = 0; 36 if(map.size() == n){ 37 int min = Math.abs(a[1]-a[0]); 38 for(int i=1;i<n;i++){ 39 int tmp = Math.abs(a[i]-a[i-1]); 40 if(tmp == min) 41 minres++; 42 else if(tmp < min){ 43 min = tmp; 44 minres = 1; 45 } 46 } 47 }else{ 48 for(Integer key : map.keySet()){ 49 int val = map.get(key); 50 if(val > 1){ 51 minres += (val * (val-1))/2; 52 } 53 } 54 } 55 //求差最大个数 56 int maxres = 0; 57 List<Integer> keyset = new ArrayList<Integer>(map.keySet()); 58 int val1 = map.get(keyset.get(0)); 59 int val2 = map.get(keyset.get(keyset.size()-1)); 60 maxres = val1 * val2; 61 System.out.println(minres + " " + maxres); 62 } 63 } 64 65 }