其他分享
首页 > 其他分享> > 摩尔投票法

摩尔投票法

作者:互联网

基础问题:用O(1)的空间和O(n)的时间找出众数(保证存在)

Solu:设出变量num和now,表示当前未被抵消的时now,有num个

  读入一个数x,如果是now,则num++;如果不是now,就被一个now抵消,num--

        如果num=0,则now=x

  最后剩下的now即是众数。

  建模理解:有n个人分成若干帮派打架,每两个人都会同归,最后人数>n/2的帮派一定获胜。

  证明:显然

PS:如果不保证众数存在,只需最后判断一下now是否为众数

例题:luogu

卡了空间,只能摩尔投票法

#include<bits/stdc++.h>
using namespace std;

int n;

int main() {
    scanf("%d",&n); 
    int now=0,num=0;
    for(int i=1;i<=n;i++) {
        int x; scanf("%d",&x);
        if(x!=now) {
            if(num==0) now=x,num=1;
                else num--;
        } else {
            num++;
        }
    }
    printf("%d\n",now);
    return 0;
}

扩展:用O(1)的空间和O(n)的时间找出>n/k的数(k>=3)(保证存在)

Solu:同上

 

标签:Solu,int,摩尔,num,投票,帮派,众数,now
来源: https://www.cnblogs.com/wsfwsf/p/13598253.html