这道题目所说的出现最多的几个数值,其实是带有附加条件的:
这几个数值中出现次数最少的那个数,要比除这几个值外的其他数的总个数要多。(说的自己都有点晕-_-!)
这样才能在最后结果中,呈现这几个数。所以必须按照数据源中的统计量分析出求前几位的数值。
其代码如下:
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的两个最大数等等……