统计数组中差最小(或最大)的组合可能个数
来源:互联网 发布:xd mac 破解版 编辑:程序博客网 时间:2024/05/17 04:27
腾讯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>#include <cstring>#include <string>#include <algorithm>#include <map>using namespace std;const int maxn = 100050;typedef long long int ll;int a[maxn];map<int,int> ma;int main(){ // freopen("in.txt",stdin,"r");// freopen("out.txt",stdout,"w"); int n; while(scanf("%d",&n)!=EOF) { ma.clear(); for(int i=0;i<n;++i)scanf("%d",&a[i]); sort(a,a+n); if(a[0] == a[n-1]){ ll ans = n; if(ans > 1)ans = ans * (ans-1)/2; else ans = 0;// n == 1 printf("%lld %lld\n",ans,ans); } else{ ll MinNum = 0,MaxNum = 1,minVal = 2e11; for(int i = 0;i < n - 1;++i) { if(a[i]==a[0])MinNum++; if(a[i]==a[n-1])MaxNum++; if(minVal > a[i+1]-a[i]) minVal = a[i+1] - a[i]; ma[a[i]]++; } ll MinAns = 0,roo = 0; if(minVal == 0){ for(int i=0;i<n-1;++i) { if(a[i]==a[i+1])roo++; else { if(roo>0){ MinAns = MinAns + roo * (roo+1) / 2; roo = 0; } } } if(roo>0){ MinAns = MinAns + roo * (roo+1) / 2; roo = 0; } } else { for(int i = 0;i < n;++i){ roo = ma[a[i]+(int)minVal]; if(roo > 0) MinAns += roo; } } printf("%lld %lld\n",MinAns,MinNum * MaxNum); } } return 0;}
0 0
- 统计数组中差最小(或最大)的组合可能个数
- 动态规划经典问题03:数组中最大的数对差(或最小的数对差)
- 使用堆栈 取数组中最小(最大)的n个数
- 找出给定数组或文件中最小的k个数
- 寻找数组N中最大(最小的)M个数(亲自调试可运行)
- 从一亿个数中找出最大的一万个数或最小的一万个数
- 重新组合两个数组,使得他们的元素差最小
- 寻找数组中满足和为定值的两个数或所有可能组合
- 寻找最小(或最大)的k个数(剑指offer30)
- 利用堆求最大或最小的前k个数
- 在一个n个数的数组中(n很大),找出前i个中的最大或最少的数
- 求数组中任意个数的组合
- 数组中最大差(左边有序)
- PHP 查找数值数组中不重复最大和最小的10个数
- 求数组中最小的k个数以及海量数据最大堆、multiset解决方案
- php 统计二维数组中某个相等值的总个数,并且组合成一个新的数组
- n个数连接得到最小或最大的多位整数(携程)
- 三个小方法:交换字符(无buffer)、统计阶乘结尾0的个数、统计整数数组中连续数字的最大和
- 记录一次TIJ中提出的对象引用计数法
- 【Dubbo】微服务架构(二): 如何把应用分解成多个服务
- POJ 1155 TELE 树形DP(背包)
- VirtualBox内Linux系统怎样与Windows共享文件
- 如何将数据变成产品?
- 统计数组中差最小(或最大)的组合可能个数
- 数字三角形
- 占位符占位符占位符占位符占位符占位符占位符占位符在阅读spark启动executor源码时候注意一个属性就是先每一个app限制executor数目的变量:executorLimit
- 虚拟机远程连接网卡设置步骤
- 走迷宫2(广度优先搜索)
- Git 初体验及其常用命令介绍(下)
- SpirngMVC会使用不同的处理器来处理注解验证
- 《Python核心编程》(第二版) 第8章 条件和循环
- 20170402_gaomj_半月结