摩尔投票法

例题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:\) 方法同上

posted @ 2020-09-01 19:59  wwwsfff  阅读(205)  评论(2编辑  收藏  举报