問題引入
給定 \(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\) 即為絕對眾數。