统计数组中差最小(或最大)的组合可能个数

这篇博客介绍了腾讯2017年暑期实习生编程题,问题是如何找到一个数组中两两组合的差值最小和最大的对数。解决方法包括先对数组排序,然后考虑特殊情况(所有元素相同)和一般情况。对于差值最大的组合,其数量等于最小元素的个数乘以最大元素的个数。对于差值最小的情况,分为差值为0和不为0两种情况,通过统计元素出现的次数来计算组合个数。
摘要由CSDN通过智能技术生成

腾讯2017暑期实习生编程题第三题

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

输入例子:
6
45 12 45 32 5 6

输出例子:
1 2

思路:先排序,分一般情况和特殊情况,

特殊情况数组所有元素相同,差最小最大的组合个数都是C(n,2)

否则,差最大的组合个数 = 最小值个数MinNum * 最大值个数MaxNum

接下来求 ,差最小(minVal )的组合个数,

(1)若最小差为0,那么统计不同的重复元素的个数,我这里写的roo是后面出现相同元素的个数,所以roo=1的意思是后续数组只有1个与当前值相同的元素,就是C(2,2),通用公式是C(roo+1,2)

(2)最小差不为0,那么用 map 统计后续数组与当前值能构成最小差的元素的个数roo,直接加

//O(n+nlogn)
#include <iostream>
#include <cstdio>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值