多数投票算法(Boyer-Moore Algorithm)
?
一、問題來源 : LeetCode169. Majority Elements
?
二、解決問題 :尋找數組中的眾數
?
三、算法介紹
1、傳統方法:
?
?包括但不僅限于暴力法(雙重循環逐個數字判斷是否為眾數)、HashMap法(計數)、排序法(中位數一定為眾數,因為即便從距離中點最遠的兩端起,眾數依舊能夠到達中位數的位置)、隨機數法(隨機找數組中一個數判斷是否為眾數)、分治法
?
?2、多數投票算法(Boyer-Moore Algorithm)
?
【1】Java版
public int majorityElement(int[] nums) {int count = 0;Integer candidate = null;for (int num : nums) {if (count == 0) {candidate = num;}count += (num == candidate) ? 1 : -1;}return candidate;}【2】Python版
def majorityElement(self, nums):count = 0candidate = Nonefor num in nums:if count == 0:candidate = numcount += (1 if num == candidate else -1)return candidate值得注意的是,當僅當眾數確定存在時,得到的candidate才有意義,例如000111和111000,按照本方法得到的candidate分別是0和1。
那為什么能夠生效呢,假設從非眾數i開頭,因為眾數的數量高于其他所有數字的總和,我們不妨取最極端的例子,即只有兩個數字的例子來看(忽略了非眾數內部的沖突)1 0 0 1 1 0 0
可以看出,數字1將會在序號2時被替換,只需要消耗相同數量的眾數來抵消非眾數即可,所以在最后一位的時候,非眾數一定被完全抵消。
?
四、參考來源
1、Title:多數投票算法(Boyer-Moore Algorithm)詳解 ?Website:https://www.cnblogs.com/andy-0212/p/10420876.html
2、Title:169. Majority Element官方題解? Website:https://leetcode-cn.com/problems/majority-element/solution/qiu-zhong-shu-by-leetcode-2/
總結
以上是生活随笔為你收集整理的多数投票算法(Boyer-Moore Algorithm)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伯乐_千里马
- 下一篇: mybatis 小于号转义