寻找一个数组中多数(众数) Boyer-Moore 投票算法

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;
}
};


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值