小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子:
6 45 12 45 32 5 6
输出例子:
1 2
思路:针对这个题要分数字有没有重复的情况,如在计算最小数组对时,6 6 6有三种数组对,而不是两种。(n*(n+1)/2)
在计算最大数组对时,2 2 3 4 4,有四种。n(min)*n(max)
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int n = scan.nextInt(); int[] array = new int[n]; for(int i=0;i<n;i++){ array[i] = scan.nextInt(); } Arrays.sort(array); int min = array[1]-array[0]; int max = array[n-1] -array[0]; int m=0; int c = 1; for(int i=1;i<n-1;i++){ int r = array[i+1]-array[i]; if(r<min){ min = r; c=1; }else if(r==min){ c++; } } int count = 0; if(min == 0){ for(int i=0;i<n-1;i++){ if(array[i+1]-array[i]==0){ count ++; }else{ m += count*(count+1)/2; count = 0; } } if(array[n-2] ==array[n-1]){ m += count*(count+1)/2; } }else{ m=c; } int minNum = 0; int maxNum = 0; for(int i=0;i<n;i++){ if(array[i]==array[0]){ minNum++; }else if(array[i]==array[n-1]){ maxNum++; } } int q = minNum*maxNum; System.out.println(m+" "+q); } } }