题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
class Solution {
public:
//因为是要找到超过一半的数,可以采用不同的数字互相消除
//最后剩下来的才有可能是超过一半的那个数,然后再遍历一半验证下
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len = numbers.size();
if (len == 0)
return 0;
//x表示当先剩下来的数,cnt表示剩下来的数的个数
int x = numbers[0], cnt = 1;
for (int i = 1; i < len; ++i)
{
if (numbers[i] == x)
++cnt;
else
{
//只剩下一个了就用新的数替换
if (cnt == 1)
x = numbers[i];
else
--cnt;
}
}
//验证
cnt = 0;
for (int i = 0; i < len; ++i)
{
if (numbers[i] == x)
++cnt;
}
return cnt*2 > len ? x : 0;
}
};