码迷,mamicode.com
首页 > 其他好文 > 详细

摩尔投票法

时间:2020-09-15 20:48:32      阅读:38      评论:0      收藏:0      [点我收藏+]

标签:clu   com   基础   ret   表示   std   color   target   code   

基础问题:用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:同上

 

摩尔投票法

标签:clu   com   基础   ret   表示   std   color   target   code   

原文地址:https://www.cnblogs.com/wsfwsf/p/13598253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!