算法总结——摩尔投票算法思想

摩尔投票算法

[PS:摩尔投票思想其实就是一组数据nums[n],其中有一个数a的数量大于等于n/2,这组数据竞争找出那个a,本身思想很简单,我把它放过来主要以为,摩尔投票提供了很好的时间复杂度O(n),和空间复杂度O(1)。]

思想:在我们求一组数据中大于等于n/2的数时,可以用排序遍历,或者排序求中位数,或者用map(hash),但是相应时间和空间复杂度都不是很满意,用摩尔就是取众数+1,非众数-1,最后加下来必定>1,也就找出了众数。
算法流程:

1.首先假设第一个数为众数temp=nums[0],count=1,
2.往后遍历遇到与这个数相同则count+1,负责count-1,
3.若count==0时,将下一个数置为temp,同时count=1,
4.重复上述步骤。
5.最后temp中就是众数

代码:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int temp = max;   //这边取max其实是怕万一nums中有和temp相等的
        int count = 0;
        for (int num : nums) {
            if (num == temp)
                count++;
            else {
               if(count!=0) count--;
               else{
                   temp==num;
                   count=1;
               }
            }            
        }
        return temp;
    }
};


补充

当然还有找出所有>=n/3的,同样可以用投票,不过这时候需要设置,两个起始数,因为最多只有2个数a,b,这两个数不互相竞争并且共进退,也就是如果后面遇到不是a,b,那么a,b的count都要减1,如果遇到a,b,这两个数相应的count+1,另外,开始的时候要选择两个不一样的起始,自己加个判断就好了。算法思想大同小异,就不写了。

还有如果只是单独想找出最多,可以用hash之类的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值