陣列入門題 用BM投票演算法 找眾數 Majority Element Leetcode #169

閱讀時間約 3 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字

出現次數最多的數字也就是我們在統計上所謂的 眾數 mode


測試範例

Example 1:

Input: nums = [3,2,3]
Output: 3
3 出現最多次

Example 2:

Input: nums = [2,2,1,1,1,2,2]
Output: 2
2 出現最多次​

 


約束條件

Constraints:

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

演算法

除了傳統的字典紀錄出現次數的演算法之外,
還有一個高效率的one-pass Bayer Morre Voting algorithm BM投票演算法。

原理很簡單,就是把每張票當成是對當下Majority候選人同意票否定票

從左到右,掃描過每一個數字。票數初始化為0


當票數為零的時候,代表演算法剛開始,或者前一位候選人被Reset to zero,重新記錄新的Majority 候選人。

當票數不為零的時候,代表已經有一位潛在的Majority候選人。
假如當下這個數字和Majority候選人相同,代表是同意票,票數累加一
假如當下這個數字和Majority候選人不同,代表是否定票,票數減一

最後掃描完,留下來的Majority候選人就當選為真正的Majority,也是出現次數最多的數字,也就是我們在統計上所謂的 眾數 mode


程式碼

class Solution:
 def majorityElement(self, nums: List[int]) -> int:

  voting = 0
  candidate = 0

  for number in nums:

   if voting == 0:
    # 重新選一位潛在的Majority候選人
    voting += 1
    candidate = number
   
   elif number == candidate:
    # 同意票
    voting += 1
   
   else:
    # 否定票
    voting -= 1

  return candidate
  

複雜度分析

時間複雜度:

O( n ) 只需要掃描整個陣列一次。

空間複雜度:

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


關鍵知識點

Bayer Morre Voting algorithm BM投票演算法是一個在O(n)內尋找眾數的演算法。

和傳統的字典演算法相比,省去了建造字典的空間,BM投票演算法在空間上更為精簡。


Reference:

[1] Python/JS/Go O(n) by BM algorithm [w/ Reference] - Majority Element - LeetCode

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
隨著奧斯卡的落幕, 這一巴掌響出天際成為熱門題材, 成為大家爭相討論模仿的話題, 但其實這背後也帶出許多的議題討論 2022年第94屆奧斯卡頒獎典禮上,喜劇演員—克里斯洛克(Chris Rock) 在舞台上大開威爾史密斯(Will Smith)的妻子 便衝上台給了克里斯一個響亮的巴掌,
Thumbnail
一場直播中,把疫情指揮中心都還不敢發佈的指引都給公開說了出來,這是社會少數人的發言,卻也是許多大型事故的發端......
Thumbnail
地震後的石岡鄉滿目瘡痍、百業蕭條,整體環境只能用破碎來形容。地震震垮了農村道路橋樑等基礎建設,也損毀了農村土地及農作,地方產業生產工具陷入崩解,連帶使得原本就業機會不多的鄉鎮雪上加霜。
   "震盪效應"算是蠻典型的非主流小人物對抗主流社會的題材,最終雖然獲得肯定,但卻沒有獲得主角預設的效應。   男主角Omalu有著典型的非主流特徵:非名校且又來自落後國家/有色人種/關心死者生前的生活/不預設立場等等,正因為如此,他發現到美式足球對於腦部的傷害,遠超乎當代的認知,也因為對於真相的
Thumbnail
因為發生地震,住家的整棟房子突然大幅度的傾斜,我也在睡夢中驚醒過來。 我下床到樓頂上去察看,發現同一棟樓許多鄰居家的陽台都崩塌了,看來震災損害相當嚴重。 由於整棟房子已經變成危樓,勢必要拆除重建,於是 ......
Thumbnail
東亞地區自古便有一種習俗是以活人為建築物奠基;古人相信只要把人活埋進地基便可以強制被埋者成為這座建築的守護神, 從而令工程得以順利完成。 據說在日本這種習俗名為「人柱」, 在 「#中國」 則名為「#打
Thumbnail
振興經濟的根本是甚麼呢?先想一件事,財富是甚麼?簡單地說,財富就是你想要的東西。而倒轉來說,負債就是你不想要的東西。「錢」只是一種將這些東西量化、而方便計算及交換的工具。如果不僅記這三點,就不可能理解經濟。
Thumbnail
儲蓄險、基金、股票、房地產 選擇權、虛擬貨幣、資金盤 (HYIP) 美股、黃金、外匯、期貨、CMS 上述站長都接觸過了,賠了500多萬 如果這短文能拯救更多朋友 500萬絕對值得
Thumbnail
投資年齡來到9歲 正巧遇到10年大關 看著越來越多"老師"被打臉 站長也一直在實現損益 希望這次退潮 站長不要是裸體的那個 😂
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
隨著奧斯卡的落幕, 這一巴掌響出天際成為熱門題材, 成為大家爭相討論模仿的話題, 但其實這背後也帶出許多的議題討論 2022年第94屆奧斯卡頒獎典禮上,喜劇演員—克里斯洛克(Chris Rock) 在舞台上大開威爾史密斯(Will Smith)的妻子 便衝上台給了克里斯一個響亮的巴掌,
Thumbnail
一場直播中,把疫情指揮中心都還不敢發佈的指引都給公開說了出來,這是社會少數人的發言,卻也是許多大型事故的發端......
Thumbnail
地震後的石岡鄉滿目瘡痍、百業蕭條,整體環境只能用破碎來形容。地震震垮了農村道路橋樑等基礎建設,也損毀了農村土地及農作,地方產業生產工具陷入崩解,連帶使得原本就業機會不多的鄉鎮雪上加霜。
   "震盪效應"算是蠻典型的非主流小人物對抗主流社會的題材,最終雖然獲得肯定,但卻沒有獲得主角預設的效應。   男主角Omalu有著典型的非主流特徵:非名校且又來自落後國家/有色人種/關心死者生前的生活/不預設立場等等,正因為如此,他發現到美式足球對於腦部的傷害,遠超乎當代的認知,也因為對於真相的
Thumbnail
因為發生地震,住家的整棟房子突然大幅度的傾斜,我也在睡夢中驚醒過來。 我下床到樓頂上去察看,發現同一棟樓許多鄰居家的陽台都崩塌了,看來震災損害相當嚴重。 由於整棟房子已經變成危樓,勢必要拆除重建,於是 ......
Thumbnail
東亞地區自古便有一種習俗是以活人為建築物奠基;古人相信只要把人活埋進地基便可以強制被埋者成為這座建築的守護神, 從而令工程得以順利完成。 據說在日本這種習俗名為「人柱」, 在 「#中國」 則名為「#打
Thumbnail
振興經濟的根本是甚麼呢?先想一件事,財富是甚麼?簡單地說,財富就是你想要的東西。而倒轉來說,負債就是你不想要的東西。「錢」只是一種將這些東西量化、而方便計算及交換的工具。如果不僅記這三點,就不可能理解經濟。
Thumbnail
儲蓄險、基金、股票、房地產 選擇權、虛擬貨幣、資金盤 (HYIP) 美股、黃金、外匯、期貨、CMS 上述站長都接觸過了,賠了500多萬 如果這短文能拯救更多朋友 500萬絕對值得
Thumbnail
投資年齡來到9歲 正巧遇到10年大關 看著越來越多"老師"被打臉 站長也一直在實現損益 希望這次退潮 站長不要是裸體的那個 😂