摩尔投票法
例题1:
用\(O(1)\)的空间和\(O(n)\)的时间找出保证存在的众数
\(Solu:\)设出变量\(num\)和\(now\),表示当前未被抵消的时\(now\),有\(num\)个
读入一个数\(x\),
当\(num\)>0时,如果\(x\)=\(now\),则\(num\)++;如果不是\(now\),就被一个\(now\)抵消,\(num\)--
反之,则\(now\)=\(x\),\(num\)=1
剩下的\(now\)是众数
建模理解:有n个人分成若干帮派打架,每两个人都会同归,最后人数为\(x\)(\(x\)>\(n-x\))的帮派一定获胜。
证明:如上
PS:如果不保证众数存在,只需最后判断一下now是否为众数
题链Luogu P2397 yyy loves Maths VI (mode)
卡了空间,只能摩尔投票法
#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\geq 3\))(保证存在)
\(Solu:\) 方法同上