摩爾投票法和大多數

原文鏈接:https://blog.csdn.net/TinyJian/article/details/79110473

版權聲明:本文爲博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/TinyJian/article/details/79110473
我的原文:http://www.hijerry.cn/p/45987.html
 

摩爾投票算法
假設有這樣一個場景:票選村長,每人可投一票,我們將候選村長從1開始編號,村民們在票上寫上候選村長的編號即可完成投票。那麼最後統計的票可形成一個整型數組。那麼誰是村長呢?票數過半的那個人。

摩爾投票算法可以快速的計算出一個數組中出現次數過半的數即大多數(majority),算法核心思想是同加,異減。我們舉個例子。

假設數組是:[1,2,1,1,2,1]。算法步驟如下:

1。當前大多數是1,得分置1
2。與當前大多數不同,得分 - 1,得分爲0,當前大多數 = 1
1。與當前大多數不同,得分爲0,所以設置當前大多數 1 -> 1,得分置1
1。與當前大多數相同,得分 + 1,得分爲2,當前大多數 = 1
2。與當前大多數不同,得分 - 1 ,得分爲1,當前大多數 = 1
1。與當前大多數相同,得分 + 1,得分爲2,當前大多數 = 1
這意味着1是這個數組中出現次數過半的數。

可以感受得到,算法會保存一個當前大多數,和得分,當遇到一個數不是當前大多數時,得分會減一,當減到0時,大多數會發生改變,並且重置得分爲1。

這裏需要區分的是,摩爾算法不能用來得到衆數(mode),例如數組:[1,1,1,2,2,3,3,4,4],摩爾算法得出最後的結果應該是4,但4並不是衆數,可是顯然4也不是大多數,那是因爲,大多數是指出現次數過半的數,而這個數組中沒有這樣的數,所以摩爾算法是是失效的,對於這種情況採取需要重新投票。

出現次數超過一半的數
LeetCode原題:169. Majority Element

這裏要求出現次數大於一半,所以直接套用摩爾投票算法即可得到答案。
 ———————————————— 

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        a, ca = None, 0
        for n in nums:
            if   a == n : ca += 1
            elif ca == 0: a, ca = n, 1
            else        : ca -= 1
        
        return a
 ———————————————— 

出現次數超過數組1/3長
LeetCode原題:229. Majority Element II

還能用摩爾投票法嗎?答案當然是要,但是需要變通一下。

需要注意的是出現次數超過1/3數組長的數,也許會有多個,例子如下:

[1,1,1,2,2,2,3,3],數組1/3長=2(向下取整),所以1和2都是符合條件的。
但最多隻能是2個

回到題目
如果我們在使用摩爾算法時,同時記錄兩個大多數,會怎麼樣呢?直覺告訴我,這會得到一個大多數,和一個出現次數僅次於大多數的數,但是這兩個數不一定會比數組長的1/3大

所以我們得到它們後,還需要檢查它們出現的次數是否符合條件。

AC代碼:
 

原文鏈接:https://blog.csdn.net/TinyJian/article/details/79110473

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章