题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
时间限制:1秒
空间限制:32768K
思路一:遍历整个数组记录当前元素出现的次数,并保存最大值,这样遍历一次数组在 O(n) 的复杂度下就可以得到答案。
思路二:用 map 记录每个元素出现的次数,数组元素作为键值,出现次数作为 value 值。
思路一代码:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int res = 0;
int max = -9999;
for (int i = 0;i < numbers.size();i++)
if (numbers[i] > max)
max = numbers[i];
int visit[max+1];
memset(visit,0,sizeof(visit));
//遍历数组获取出现次数最大的元素
for (int i = 0;i < numbers.size();i++) {
visit[numbers[i]]++;
if (visit[numbers[i]] > (numbers.size()/2)) {
res = numbers[i];
break;
}
}
return res;
}
思路二代码:
int MoreThanHalfNum_Solution2(vector<int> numbers) {
int len = numbers.size();
int res = 0;
map<int,int> m;
for (int i = 0;i < numbers.size();i++) {
res = ++m[numbers[i]];
if (res > len/2)
return numbers[i];
}
return 0;
}
**注意:**在方式一中,当数组元素 numbers[i] 过大时,不适用,因为超出 int 范围后不能再使用 visit 数组去存放其出现的次数。