原题出处:牛客网-腾讯2017暑期实习生编程题
[编程题] 有趣的数字
时间限制:1秒
空间限制:32768K
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2…an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子1:
6
45 12 45 32 5 6
输出例子1:
1 2
解题思路:
个人思路:
看不懂题目…二元组的概念,百度得到的信息(多元组概念、有序对概念):二元组为一个有序对,有序对对元素的排列顺序是重视的,那么(a,b)和(b,a)就是两个不同的二元组,既然如此应该也要考虑到差值为负的情况。。。结果错误,不知这是我想多了还是我的理解出错?但是hofighter的题解给了我很大的启示,面对一个问题要多考虑一下其他情况。
hofighter解题思路
对输入序列排序
判断序列首个元素与末尾元素是否相等
是,说明序列中所有元素相同,直接输出结果为n*(n-1)/2 <= 组合公式推出
否,执行下一步
统计各数字的出现次数
判断序列中是否有重复出现的元素
是,说明最小值为0,直接统计各个重复出现的元素的所有组合数的和,结果为最小差对数。
否,执行下一步
对序列中元素按序进行遍历,查找最小差,统计最小差对数。
统计最大差对数,最大差对数=序列首个元素的个数*序列末尾元素的个数
贴上C#代码:
using System;
using System.Collections.Generic;
using System.Linq;