有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

转载 2016年08月30日 21:54:53

   有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

输入描述:

输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 a1,a2...an - 需要计算的数据 保证: 1<=N<=100000,0<=ai<=INT_MAX.



输出描述:

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。


输入例子:
6
45 12 45 32 5 6
输出例子:
1 2
先用快排,然后对有序数组分别求差值最大的对数和差值最小的对数。
快排之后,如果数组为常数数组,即最大值=最小值,则结果已经出来了。否则,进行下面的操作,其中:
1. 差值最大的好求,看有序数组有几个最小值和几个最大值,相乘即可。
2. 差值最小的,由于是有序数组,必定是相邻的差值较小,故由快排后的有序数组生成差值数组(即相邻的两两相减)。如果差值数组中0,则查看差值数组中连续0的组数,可以由排列组合知识计算总的差值最小的对数;如果差值数组中没有0,则只需计算差值数组中有多少个最小值即可。注:差值数组必定都是非负数。
3. 空间复杂度较大,需要一些辅助数组。
4. 时间复杂度:快排O(NlogN),求差值最大O(N),求差值最小O(N),所以最终的时间复杂度为O(NlogN)。

importjava.util.Arrays;
importjava.util.Scanner;
 
publicclass Jd_NumAbs {
    privatestatic Scanner scanner = newScanner(System.in);
 
    publicstatic void main(String[] args) {
        while(scanner.hasNext()) {
            intnum = scanner.nextInt();
            int[] nums = newint[num];
            for(inti = 0; i < num; i++) {
                nums[i] = scanner.nextInt();
            }
            // getMinMaxAbsNums(nums, num);
            fun2(nums, num);
        }
    }
 
    publicstatic void getMinMaxAbsNums(int[] nums, intlen) {
        intminNum = 0, maxNum = 0;
        intmin = Integer.MAX_VALUE;
        intmax = Integer.MIN_VALUE;
        for(inti = 0; i < len - 1; i++) {// 时间复杂度n^2
            for(intj = i + 1; j < len - 1; j++) {
                intabs = Math.abs(nums[i] - nums[j]);
                if(abs < min) {
                    minNum = 1;
                    min = abs;
                } elseif (min == abs) {
                    minNum++;
                } elseif (abs > max) {
                    max = abs;
                    maxNum = 1;
                } elseif (max == abs) {
                    maxNum++;
                }
            }
        }
        System.out.println(minNum + " " + maxNum);
    }
 
    publicstatic void fun2(int[] nums, intlen) {
        Arrays.sort(nums);// 时间复杂度nlogn
        intmaxCount = 0;
        intminNum = 1, maxNum = 1;// 数组中最小和最大元素的个数
        inti = 1;
        while(i < len && nums[i - 1] == nums[i]) {
            minNum++;
            i++;
        }
        i = len - 2;
        while(i >= 0&& nums[i] == nums[i + 1]) {
            maxNum++;
            i--;
        }
        if(nums[0] == nums[len - 1]) {
            maxCount = len * (len - 1) / 2;
        } else{
            maxCount = minNum * maxNum;
        }
        for(intj = 1; j < len; j++) {
            nums[j - 1] = Math.abs(nums[j] - nums[j - 1]);
        }
        intminValue = Integer.MAX_VALUE;
        intminCount = 0;
        for(intj = 0; j < nums.length; j++) {//初次统计minValue
            if(nums[j] < minValue) {
                minCount = 1;
                minValue=nums[j];
            } elseif (nums[j] == minValue) {
                minCount++;
            }
        }
        if(minValue==0){//如果最小差值为0,统计0的区间个数
            minCount=0;
            inttempMinCount=0;
            for(intj = 0; j < len-1; j++) {
                if(nums[j]==0) {
                    tempMinCount++;
                }else{
                    minCount+=tempMinCount*(tempMinCount+1)/2;
                    tempMinCount=0;
                }
            }
            minCount+=tempMinCount*(tempMinCount+1)/2;
        }
        System.out.println(minCount + " " + maxCount);
    }
}



腾讯校招笔试——小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

题目: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: 输入包含多组测试数据。 对于每组测试数据: ...
  • gxh27954
  • gxh27954
  • 2017年04月01日 21:55
  • 358

1-n,从中选择任意两两不同的k个数,输出所有可能的组合,要求不重不漏

參考:http://blog.csdn.net/hyq666888/article/details/22572695 /** * 给定n个数{1,2,3,...,n},从中选择...
  • Sum_ck
  • Sum_ck
  • 2014年04月03日 12:08
  • 1150

给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合

如题,给定n为5,则这n个数为{1,2,3,4,5},给定k为2, 则所有的可能组合为: {1,2}、{1,3}、{1,4}、{1,5}、{2,3}、{2,4}、{2,5}、{3,4}、{3,5}...
  • hyq666888
  • hyq666888
  • 2014年03月30日 09:52
  • 1712

有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

题目描述: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 1.先排序          特殊情况:如果排完序之后发现数组中所有数都相同,直接输出结果...
  • smallfish_love
  • smallfish_love
  • 2016年09月04日 11:52
  • 1848

腾讯笔试编程题:两两二元组差最小最大对数(C++)

题目: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: 输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 ...
  • lxubin
  • lxubin
  • 2016年09月04日 22:42
  • 2458

有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
  • someone_ikok
  • someone_ikok
  • 2016年06月10日 17:39
  • 1575

腾讯笔试编程题--小Q上厕所

题目 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入 输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数...
  • Szu_AKer
  • Szu_AKer
  • 2016年09月11日 11:26
  • 802

数字序列中的最大差和最小差对数

题目: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 例如: 输入 6   45 32 45 16 6 5   输出 1  2 ...
  • u011707827
  • u011707827
  • 2016年09月02日 23:07
  • 919

整数数组中两两之差绝对值最小的值

题目1: 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 题目2:请求出最小连续子序列绝对值和,也就是求连续子序列之和的绝对值最小值 针对问题1: 方法...
  • yusiguyuan
  • yusiguyuan
  • 2015年01月08日 16:01
  • 5208

有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

题目描述: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 1.先排序          特殊情况:如果排完序之后发现数组中所有数都相同,直接输出结果...
  • smallfish_love
  • smallfish_love
  • 2016年09月04日 11:52
  • 1848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
举报原因:
原因补充:

(最多只允许输入30个字)