方法一:
思路:摩尔投票法。先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将下一个值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。(这种方法的前提是数组中一定有众数的存在)。
int ans, count = 0;
for (int num : nums)
{
if (count == 0)
{
ans = num; ++count;
}
else
if (num == ans) ++count;
else --count;
}
return ans;
方法二:
思路:位操作法。
每次统计每位上出现次数超过n/2的数是0还是1,最后将每位上的数合并即为众数。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int ans=0,n=nums.size();
for (int i = 0; i < 32; ++i)
{
int one = 0, zero = 0;
for (int num : nums)
{
if (one>n / 2 || zero > n / 2) break;
if (num&(1 << i))++one;
else ++zero;
}
if (one > zero) ans |= (1 << i);
}
return ans;
}
};