Easy草稿★★★★O(n) 時間 · O(1) 空間
ArrayHash TableSorting
Patterns#️⃣ 雜湊🔢 排序後處理
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

169Majority ElementArrays & HashingEasyArrays & Hashing

給定大小為 n 的陣列 nums,回傳多數元素。多數元素是出現次數超過 n/2 的元素。保證多數元素一定存在。

Example:

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

Intuition

TIP

核心思路:Boyer-Moore 投票演算法——把多數元素看作「票數最多的候選人」,用 +1/-1 計票。

Approaches

1. HashMap Counting — O(n) / O(n)
  • Idea: 用 HashMap 統計每個元素的出現次數,找出超過 n/2 的
  • Time: O(n) - 遍歷一次
  • Space: O(n) - HashMap 儲存
class Solution {
    fun majorityElement(nums: IntArray): Int {
        val count = HashMap<Int, Int>()
        for (num in nums) {
            count[num] = (count[num] ?: 0) + 1
            if (count[num]!! > nums.size / 2) return num
        }
        throw IllegalArgumentException()
    }
}
⭐ 2. Boyer-Moore Voting Algorithm — O(n) / O(1)
  • Idea: 維護候選人 candidate 和計數器 count,遇到相同元素 +1,不同 -1,歸零時更換候選人
  • Time: O(n) - 一次遍歷
  • Space: O(1) - 只用兩個變數
class Solution {
    fun majorityElement(nums: IntArray): Int {
        var candidate = nums[0]
        var count = 0
        for (num in nums) {
            if (count == 0) candidate = num
            count += if (num == candidate) 1 else -1
        }
        return candidate
    }
}
Note: Sorting

排序後,多數元素一定出現在中間位置 nums[n/2]

class Solution {
    fun majorityElement(nums: IntArray): Int {
        nums.sort()
        return nums[nums.size / 2]
    }
}

時間 O(n log n),空間 O(1)(原地排序)。

🔑 Takeaways