Boyer-Moore 投票算法
(1)字面理解就是候选人是众数,所以给他投票的人是最多的,赞成票肯定大于反对票,最终众数胜出。
(2)投票算法个人思路,数组中众数和其他数分成几队人在一个擂台上打架,每次擂台随机上一队的人,
如果擂台没人则留在擂台上当擂主等待挑战者;
如果是同队则一起留在擂台上;
如果不是一队的人,就干一架,因为打的比较狠,挑战者和擂台上一个人一起被抬下去;
最后,因为众数人多,所以最后站在擂台上的擂主一定是众数队,众数,永远滴神!
同时可以发现其他队不懂团结,他们的内斗消耗更有利于众数获胜(队内成员不用全部上擂台就已经没有挑战者了);
假设极端情况下数组只有两种数,众数队n+1,另一数n-1,1换1也不够打的,众数队依然可以在擂台上站到最后。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int champoin=-1;
int people=0;
for(int challenger:nums)
{
if(challenger==champoin)
people++;
else
{
people--;
if(people<0)
{
people=1;
champoin=challenger;
}
}
}
return champoin;
}
};
位运算
记录一个有趣的解法
class Solution {
public:
int majorityElement(vector<int>& nums) {
int res=0;
for(int i=0;i<32;i++)
{
int ones=0;
for(int n:nums)
ones += (n >> i) & 1; //位运算法统计每个位置上1出现的次数,每次出现则ones+1
res += (ones > nums.size()/2) << i; //如果1出现次数大于2分之1数组的长度,1即为这个位置的目标数字
}
return res;
}
};