题目描述
求解绝对众数之前,我们可以先了解下众数及绝对众数的含义;
众数:给定N个数,称出现次数最多的数称为众数;
绝对众数:若某个众数出现的次数大于N/2,称该数为绝对众数;
了解绝对众数的含义之后,我们可以发现在一个数组中删除两个不同的数,绝对众数是保持不变的;
比如:两个数中有一个数是绝对众数,则剩余的N-2个数中,绝对众数仍然大于(N-1)/2;
因此,借助上面的思想,可以设计算法:
1、temp记录绝对众数,counter记录绝对众数的数目;
2、若counter == 0,则temp = numbers[i], counter = 1;
若counter != 0 且 temp!= numbers[i], 则同时删除temp和numbers[i], 利用counter--完成这个功能;
若counter != 0 且 temp== numbers[i], 则counter++;
具体细节, 见代码:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if (numbers.size() == 0)
{
return 0;
}
else if (numbers.size() == 1)
{
return numbers[0];
}
int counter = 0;
int temp = numbers[0];
vector<int> index(6556, 0);
for (int i = 0; i < numbers.size(); i++)
{
index[numbers[i]]++;
if (counter == 0)
{
temp = numbers[i];
counter = 1;
}
else if (temp == numbers[i])
{
counter++;
}
else
{
counter--;
}
}
if (index[temp] > numbers.size() / 2)
{
return temp;
}
else
{
return 0;
}
}
};