腾讯2017实习 数组组成二元组最大值最小值的数量

题目:

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

输入描述:

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



输出描述:

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

 

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

 

输出例子:
1 2

思路:

  1.先排序
         特殊情况:如果排完序之后发现数组中所有数都相同,直接输出结果
             结果为:差最大个数 = 差最小个数 = (n * (n-1))/2;(两两组合)
    2.计算差最小个数
        2.1.如果数组中没有重复数字,说明最小差不为0,最小差肯定是数组中相邻两个数的差
            因此,遍历一边数组,计算并统计最小差。
        2.2.如果数组中有重复数字,说明最小差是0,此时,查找相同元素,求其组合 例如3 3 3 3结果为1+2+3=6种
    3.计算差最大个数
        只有一种情况,最大值与最小值的两两组合,即最大值个数 * 最小值个数

代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <limits.h>
 5 using namespace std;
 6 
 7 int getMin(vector<int> v)
 8 {
 9     sort(v.begin(), v.end());
10     int min = INT_MAX;
11     for (int i = 1; i < v.size(); ++i)
12     {
13         if (v[i] - v[i - 1] < min)
14         {
15             min = v[i] - v[i - 1];
16         }
17     }
18     int count = 0;
19     //有相同的元素,用组合求对数 比如3 3 3 有三对而不是两对
20     if (min == 0)
21     {
22         for (int i = 1; i < v.size(); ++i)
23         {
24             int j = i - 1;
25             while (j >= 0 && v[i] == v[j])
26             {
27                 ++count;
28                 --j;
29             }
30         }
31     }
32     else {
33         for (int i = 1; i < v.size(); ++i)
34         {
35             if (v[i] - v[i - 1] == min)
36                 ++count;
37         }
38     }
39     return count;
40 }
41 
42 int getMax(vector<int> v)
43 {
44     int max = *max_element(v.begin(), v.end());
45     int min = *min_element(v.begin(), v.end());
46     int minNum = 0, maxNum = 0;
47     for (auto num : v)
48     {
49         if (num == max)
50             ++maxNum;
51         if (num == min)
52             ++minNum;
53     }
54     //当最大值等于最小值 数据全部一样 例如3 3 3 这时候3*3=9显然不对
55     int size = v.size();
56     if (min == max)
57         return size*(size - 1) / 2;
58     else
59         return minNum * maxNum;
60 }
61 
62 int  main()
63 {
64     int n;
65     int temp;    
66     while (cin >> n)
67     {
68         vector<int> v;
69         for (int i = 0; i < n; ++i)
70         {
71             cin >> temp;
72             v.push_back(temp);
73         }
74         cout << getMin(v) <<' ' << getMax(v) << endl;
75     }
76     
77 }

 

posted @ 2016-08-20 21:19  zhangbaochong  阅读(1263)  评论(0)    收藏  举报