问题引入
给定 \(n\) 个数 \(a_i\),求出该数列的绝对众数,保证该绝对众数存在。
\(n\le 10^7\),空间限制 1MB。
算法介绍
摩尔投票法可以 \(O(1)\) 空间 \(O(n)\) 时间内求出一个数列的绝对众数,使用前提是数列保证存在绝对众数,否则你只能求出一个可能是绝对众数的数,这时你还需要使用其他方法验证该数是否是绝对众数。
核心思想是利用绝对众数出现次数大于其他任何数的出现次数的性质,让两个不同的数抵消,剩下的数一定会是绝对众数。
算法流程:
- 记录一个当前候选众数 \(maj\) 以及一个出现次数 \(cnt\)。
- 初始设 \(maj=a_1,cnt=1\)。
- 从 \(i=2\rightarrow n\),
- 若 \(cnt=0\),则 \(maj\leftarrow a_i\)
- 若 \(a_i\not=maj\),则 \(cnt\leftarrow cnt-1\)。
- 若 \(a_i=maj\),则 \(cnt\leftarrow cnt+1\)。
\(maj\) 即为绝对众数。
标签:cnt,浅谈,leftarrow,绝对,摩尔,投票,众数,maj,数列 From: https://www.cnblogs.com/dcytrl/p/18388510