题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000
1. 分析
思路1:借助哈希表,每遍历到一个元素key,其value就加1,然后判断value是否大于数组的一半,是的话,就直接输出。
思路2:摩尔投票法。成立的前提是有超过一半的元素。
2. 用C++写出逻辑
// 思路1:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int n = numbers.size();
unordered_map<int, int>umap;
for(int i = 0; i < n; ++i){
umap[numbers[i]]++;
if(umap[numbers[i]] > n / 2)
return numbers[i];
}
return -1;
}
// 思路2:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int cnt = 0, num = 0;
int n = numbers.size();
for(int i = 0; i < n; ++i){
if(cnt == 0){
num = numbers[i];
cnt = 1;
}
else{
num == numbers[i] ? cnt++ : cnt--;
}
}
cnt = count(numbers.begin(), numbers.end(),num);
return cnt > n / 2 ? num : 0;
}