陣列入門題 用BM投票演算法 找超過n/3的領先者 Majority Element II Leetcode #229

閱讀時間約 5 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定我們一個陣列,陣列長度為n。
要求我們找出裡面出現次數超過 n / 3次的數字


測試範例

Example 1:

Input: nums = [3,2,3]
Output: [3]

Example 2:

Input: nums = [1]
Output: [1]

Example 3:

Input: nums = [1,2]
Output: [1,2]

約束條件

Constraints:

  • 1 <= nums.length <= 5 * 104
  • -109 <= nums[i] <= 109

 Follow up: Could you solve the problem in linear time and in O(1) space?


演算法

如果只是第一直覺的話,第一輪掃描先用字典來統計出現次數,第二輪再挑選出現次數超過 n/3次的元素即可。

但是,這題其實也可以用前一題學過的Bayer Moore投票演算法的模板來解。

第一輪選舉輪,先選出票數領先的前兩人

第二輪驗證輪,驗票,檢驗領先的前兩人是否票數有超過n/3,若有,則放入最後的當選名單。

實作上有一個小細節,為什麼我們只需要選出領先的前兩人?
因為題目的規則是要超過n/3,透過簡單的反證法,可以證出最多只會有兩人有機會超過n/3

推廣題: 若題目改成超過n/k,則最多只會有(k-1)人有機會超過 n/k


程式碼

class Solution:
 def majorityElement(self, nums: List[int]) -> List[int]:
  
  # a list of majority elements
  majority = []
  
  # threshold for majority validation and verification
  threshold = len(nums) // 3
  
  # Record for possible majority candidates, at most two majority elements is allowed by math-proof.
  candidate = [0, 0]
  
  # Voting for majority candidates
  voting = [0, 0]
  
  ## Step_#1:
  # Find possible majority candidates
  for number in nums:
   
   if number == candidate[0]:
    # up vote to first candidate
    voting[0] += 1
    
   elif number == candidate[1]:
    # up vote to second candidate
    voting[1] += 1
   
   elif not voting[0]:
    # set first candidate
    candidate[0] = number
    voting[0] = 1
    
   elif not voting[1]:
    # set second candidate
    candidate[1] = number
    voting[1] = 1
    
   else:
    # down vote if mis-match
    voting[0] -= 1
    voting[1] -= 1
  
  
  ## Step_#2:
  # Validation:
  voting = [0, 0]
  
  for number in nums:
   
   if number == candidate[0]:
    # update up vote for first candidate
    voting[0] += 1
    
   elif number == candidate[1]:
    # update up vote for second candidate
    voting[1] += 1
  
  
  for i, vote in enumerate(voting):
   
   # Verify majority by threshold
   if vote > threshold:
    majority.append( candidate[i] )
   
   
  return majority

複雜度分析

時間複雜度:

O( n ) 投票輪和驗證輪,複雜度皆為線性,各掃描一次。

空間複雜度:

O(1) majority, voting, candidate都是臨時變數,所占用的記憶體空間固定,都是常數級別O(1)


關鍵知識點

關鍵點在於聯想到用BM投票演算法找出領先者。

前一題,我們用BM投票演算法找出票數最多的那一位,也稱之為眾數 mode。

在這一題,我們用BM投票演算法找出票數相對多的前k位,k=2,同時門檻票數要求超過 n/3


Reference:

[1] Python O(1) aux space sol. by BM vote algorithm. [ With explanation ] - Majority Element II - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
1. 競賽題 或者 面試題 Medium Hard 以上題目,一開始在第一時間想不出解題思路,或者最佳解是很平常的事情。 通過官方解答、討論區的高手分享解題,進而學到新的解題思路,或者更泛用的演算法框架,就是最大的收穫。 2. 但是Easy分類的題目,通常就是該領域最基礎的題目,應該要
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
1. 競賽題 或者 面試題 Medium Hard 以上題目,一開始在第一時間想不出解題思路,或者最佳解是很平常的事情。 通過官方解答、討論區的高手分享解題,進而學到新的解題思路,或者更泛用的演算法框架,就是最大的收穫。 2. 但是Easy分類的題目,通常就是該領域最基礎的題目,應該要
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
財政部北區國稅局表示,營利事業出售國內上市(櫃)、未上市(櫃)股票之所得,依所得稅法第4條之1規定,屬證券交易所得停止課徵所得稅,惟依所得基本稅額條例第7條第1項規定,計算基本所得額時應加計前揭所得。另依同條例第7條第2項規定,經稽徵機關核定之證券交易損失,得自發生年度之次年度起5年內,從當年度之證
不管在星星兒進行適應轉變的過程而引導,甚至在星星兒得不到具體明確的回應,要是因此霸凌星星兒,務必列入永無止盡的黑名單。 防止星星兒的二次傷害 在星星兒的立場,因為知人知面不知心,導致星星兒無法判斷人心的善惡。 畢竟,人很複雜。 當然,真要說,有星星兒在適應轉變,而無法適應轉變,反而出現嚴重傷
摘要 當公司出售證券有獲利時,需要申報基本所得額,也就是記入最低稅負制 正文 財政部北區國稅局表示,營利事業出售國內上市(櫃)、未上市(櫃)股票之所得,依所得稅法第4條之1規定,屬證券交易所得停止課徵所得稅,惟依所得基本稅額條例第7條第1項規定,計算基本所得額時應加計前揭所得。另依同條
Thumbnail
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
Thumbnail
題目會給定我們一個陣列,陣列長度為n。 要求我們找出裡面出現次數超過 n / 3次的數字。
Thumbnail
隨著奧斯卡的落幕, 這一巴掌響出天際成為熱門題材, 成為大家爭相討論模仿的話題, 但其實這背後也帶出許多的議題討論 2022年第94屆奧斯卡頒獎典禮上,喜劇演員—克里斯洛克(Chris Rock) 在舞台上大開威爾史密斯(Will Smith)的妻子 便衝上台給了克里斯一個響亮的巴掌,
Thumbnail
「漢字切割刀」也能造字?不是只有靠著六書才能造字嗎? 沒錯,漢字世界造字可不只有六書而已,花招不少,是時候該進化一下了!
Thumbnail
地震後的石岡鄉滿目瘡痍、百業蕭條,整體環境只能用破碎來形容。地震震垮了農村道路橋樑等基礎建設,也損毀了農村土地及農作,地方產業生產工具陷入崩解,連帶使得原本就業機會不多的鄉鎮雪上加霜。
   "震盪效應"算是蠻典型的非主流小人物對抗主流社會的題材,最終雖然獲得肯定,但卻沒有獲得主角預設的效應。   男主角Omalu有著典型的非主流特徵:非名校且又來自落後國家/有色人種/關心死者生前的生活/不預設立場等等,正因為如此,他發現到美式足球對於腦部的傷害,遠超乎當代的認知,也因為對於真相的
Thumbnail
因為發生地震,住家的整棟房子突然大幅度的傾斜,我也在睡夢中驚醒過來。 我下床到樓頂上去察看,發現同一棟樓許多鄰居家的陽台都崩塌了,看來震災損害相當嚴重。 由於整棟房子已經變成危樓,勢必要拆除重建,於是 ......
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
財政部北區國稅局表示,營利事業出售國內上市(櫃)、未上市(櫃)股票之所得,依所得稅法第4條之1規定,屬證券交易所得停止課徵所得稅,惟依所得基本稅額條例第7條第1項規定,計算基本所得額時應加計前揭所得。另依同條例第7條第2項規定,經稽徵機關核定之證券交易損失,得自發生年度之次年度起5年內,從當年度之證
不管在星星兒進行適應轉變的過程而引導,甚至在星星兒得不到具體明確的回應,要是因此霸凌星星兒,務必列入永無止盡的黑名單。 防止星星兒的二次傷害 在星星兒的立場,因為知人知面不知心,導致星星兒無法判斷人心的善惡。 畢竟,人很複雜。 當然,真要說,有星星兒在適應轉變,而無法適應轉變,反而出現嚴重傷
摘要 當公司出售證券有獲利時,需要申報基本所得額,也就是記入最低稅負制 正文 財政部北區國稅局表示,營利事業出售國內上市(櫃)、未上市(櫃)股票之所得,依所得稅法第4條之1規定,屬證券交易所得停止課徵所得稅,惟依所得基本稅額條例第7條第1項規定,計算基本所得額時應加計前揭所得。另依同條
Thumbnail
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
Thumbnail
題目會給定我們一個陣列,陣列長度為n。 要求我們找出裡面出現次數超過 n / 3次的數字。
Thumbnail
隨著奧斯卡的落幕, 這一巴掌響出天際成為熱門題材, 成為大家爭相討論模仿的話題, 但其實這背後也帶出許多的議題討論 2022年第94屆奧斯卡頒獎典禮上,喜劇演員—克里斯洛克(Chris Rock) 在舞台上大開威爾史密斯(Will Smith)的妻子 便衝上台給了克里斯一個響亮的巴掌,
Thumbnail
「漢字切割刀」也能造字?不是只有靠著六書才能造字嗎? 沒錯,漢字世界造字可不只有六書而已,花招不少,是時候該進化一下了!
Thumbnail
地震後的石岡鄉滿目瘡痍、百業蕭條,整體環境只能用破碎來形容。地震震垮了農村道路橋樑等基礎建設,也損毀了農村土地及農作,地方產業生產工具陷入崩解,連帶使得原本就業機會不多的鄉鎮雪上加霜。
   "震盪效應"算是蠻典型的非主流小人物對抗主流社會的題材,最終雖然獲得肯定,但卻沒有獲得主角預設的效應。   男主角Omalu有著典型的非主流特徵:非名校且又來自落後國家/有色人種/關心死者生前的生活/不預設立場等等,正因為如此,他發現到美式足球對於腦部的傷害,遠超乎當代的認知,也因為對於真相的
Thumbnail
因為發生地震,住家的整棟房子突然大幅度的傾斜,我也在睡夢中驚醒過來。 我下床到樓頂上去察看,發現同一棟樓許多鄰居家的陽台都崩塌了,看來震災損害相當嚴重。 由於整棟房子已經變成危樓,勢必要拆除重建,於是 ......