数组中出现次数超过一半的数字-C++-Map法
数组中出现次数超过一半的数字
http://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163
由于输入的数组中元素大小范围未知,故最开始的思路是考虑采用一个超大数组num[1024]来记录各元素的个数的方法不合适。继续思考以下的思路:构建map<int,int>(元素值,元素个数)。
具体的算法思路为:
若输入的元素个数为0,则不存在返回0;
若输入的元素个数为1,则返回number[0];
从前向后遍历numbers数组:
如果map容器中未找到当前元素numbers[i],则将当前元素numbers[i],和元素个数1插入到map容器中;
make_pair(numbers[i],1);若找到numbers[i],则取出numbers[i]元素的个数,并将当前元素个数+1,
如果当前元素个数大于数组长度的一半,则返回当前元素;
否则,先删除map容器中的numbers[i],再插入到容器中 make_pair(numbers[i],count)未找到满足要求的元素,末尾返回0
具体代码实现:class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { int numbers_size=numbers.size(); if(numbers_size == 0){ return 0; } if(numbers_size == 1){ return numbers[0]; } int halfValue=numbers_size/2; int result=0; map<int,int> num_map; for(int i=0; i<numbers_size; i++){ if(num_map.find(numbers[i]) == num_map.end()){ num_map.insert(make_pair(numbers[i],1)); } else{ int count=num_map[numbers[i]]; count++; //若当前数字出现次数超过数组长度的一半,则break if(count > halfValue){ result=numbers[i]; return result; } num_map.erase(numbers[i]); num_map.insert(make_pair(numbers[i],count)); } } return result; } };