iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
自我挑戰組

從零開始學習LeetCode系列 第 20

Day 20 Majority Element

  • 分享至 

  • xImage
  •  

題目:給你一個整數陣列 nums,請找出其中「出現次數超過 ⌊n / 2⌋」的元素(即出現次數比所有其他數都多)。

  • 可以假設這個陣列一定有這樣的一個元素
  • https://ithelp.ithome.com.tw/upload/images/20251004/201693392CEWpn2bDE.jpg

解法一
https://ithelp.ithome.com.tw/upload/images/20251004/20169339LS5pYhV99R.jpg

  • 對每個元素計算它在整個陣列中出現的次數,如果超過一半就回傳
  • 直觀、易懂,但效率差
  • https://ithelp.ithome.com.tw/upload/images/20251004/20169339U3aVuhWii5.jpg

註解

  • nums.count(num):計算目前數字在陣列中出現的次數
  • len(nums) // 2:取整除,表示「一半的長度」
  • 若超過一半,代表它是多數元素

理解

  • 就像投票:
    你檢查每個人得票數,看誰拿到超過一半選票,就宣布他是贏家。
    簡單,但會重複計算很多次票數 → 效率低。

解法二
https://ithelp.ithome.com.tw/upload/images/20251004/20169339oKnlqmBI9Y.jpg

  • Hash Map(計數法)
  • 使用字典(或 collections.Counter)記錄每個數字出現次數,再找出次數最多的那個

註解

  • Counter(nums) → 建立每個元素的出現次數表
  • 遍歷所有項目,找出出現次數超過一半的元素
  • 時間 O(n),空間 O(n)

理解

  • 就像計票員拿一張表:
    (1)每次投票就把那個人票數 +1
    (2)最後看誰的票數超過一半

解法三
https://ithelp.ithome.com.tw/upload/images/20251004/20169339By9W0yEXJW.jpg

  • Boyer-Moore 投票演算法
  • 無需額外空間

註解

  • count == 0:沒有候選人時,換成目前的數字
  • num == candidate → 票數加一,否則減一
  • 因為多數元素超過一半,即使扣掉別的數,也會最後勝出

理解

  • 可以想像:
    (1)兩個人對決(不同數互相抵消)
    (2)因為多數元素的數量一定比較多,
    最後剩下的「沒被抵完的」那個人就是贏家。

上一篇
Day 19 Intersection of Two Arrays II
系列文
從零開始學習LeetCode20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言