找出出现次数最多的几个数值

这道题目所说的出现最多的几个数值,其实是带有附加条件的:

  这几个数值中出现次数最少的那个数,要比除这几个值外的其他数的总个数要多。(说的自己都有点晕-_-!)

这样才能在最后结果中,呈现这几个数。所以必须按照数据源中的统计量分析出求前几位的数值。

其代码如下:

 1 #include <iostream>
 2 #include <hash_map>
 3 using namespace std;
 4 
 5 void Find(int data[], int length, hash_map<int, int>& hMap,int id_count)
 6 {
 7     int min_index = -1;
 8     int min_temp = 0;
 9 
10     for(int i = 0; i < length; i++)
11     {
12         //找到元素
13         if (hMap.find(data[i]) != hMap.end())
14         {
15             hMap[data[i]]++;
16         }
17         else //没找到,进行抵消
18         {
19             //初始化阶段
20             if(hMap.size() < id_count)
21             {
22                 hMap[data[i]] = 1;
23                 min_index = data[i];
24                 min_temp = 1;
25             }
26             else //进行抵消
27             {
28                 //找到最小索引
29                 hash_map<int, int>::iterator it_end = hMap.end();
30                 for (hash_map<int, int>::iterator it = hMap.begin();
31                     it != it_end; it++)
32                 {
33                    if (it->second <= min_temp)
34                    {
35                         min_temp = it->second;
36                         min_index = it->first;
37                         break;
38                    }
39                 }
40                 if (hMap[min_index] == 1)
41                 {
42                     hMap.erase(min_index);
43                 }
44                 else
45                 {
46                     min_temp = --hMap[min_index];
47                 }
48             }
49         }
50     }
51 }
52 
53 int main()
54 {
55     //int data[] = {1, 2, 6, 2, 2, 4, 4, 3, 4, 2, 4}; 
56     int data[] = {3,4,5,3,6,1,3,4,4,5,2,4,5,3,5,};
57     int id_count = 3;
58     hash_map<int, int> hMap;
59     
60     Find(data, sizeof(data) / sizeof(int), hMap, id_count);
61     hash_map<int, int>::iterator it_end = hMap.end();
62     for (hash_map<int, int>::iterator it = hMap.begin();
63          it != it_end; it++)
64     {
65         cout << it->first << "is" << it->second << endl;
66     }
67     
68     return 0;
69 }

此程序时间复杂度为O(n),并用到了hash_map,为了能快速查找,这在较多数据时,性能提升比较明显。hash需要初始化桶的个数,因为hash的内存平均使用率为50%,再加上当超出hash范围时,需要平方重新分配空间,在工程中如不初始化桶的个数,程序经常会崩掉。

但windows中的hash_map并不需要初始化,由系统自行管理,这个有点诡异。

相对于本文的类似题目有:

找出数组中超过半数的数、超过1/3的两个最大数等等……

转载于:https://www.cnblogs.com/michaelGD/archive/2012/11/23/2785131.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值