# LeetCode如何求眾數
## 什么是眾數
眾數(Mode)是統計學中的概念,指在一組數據中出現次數最多的數值。與平均數、中位數不同,眾數反映的是數據的集中趨勢中最常見的值。例如:
- 數據集 `[1, 2, 2, 3]` 的眾數是 `2`
- 數據集 `[1, 1, 2, 2]` 的眾數是 `1` 和 `2`(多眾數情況)
在LeetCode中,典型的眾數問題如 **169. Majority Element**(多數元素),要求找出出現次數超過 `?n/2?` 次的元素。
---
## 常見解法與代碼實現
### 方法一:哈希表統計法
**核心思想**:通過哈希表記錄每個元素的出現次數,最后返回出現次數最多的元素。
```python
def majorityElement(nums):
counts = {}
for num in nums:
counts[num] = counts.get(num, 0) + 1
return max(counts.keys(), key=counts.get)
復雜度分析: - 時間復雜度:O(n),遍歷數組一次 - 空間復雜度:O(n),最壞情況下需要存儲所有元素
核心思想:排序后,眾數一定會出現在數組中間位置(僅適用于多數元素問題)。
def majorityElement(nums):
nums.sort()
return nums[len(nums)//2]
復雜度分析: - 時間復雜度:O(n log n),取決于排序算法 - 空間復雜度:O(1) 或 O(n),視排序實現而定
最優解:適用于出現次數超過一半的眾數問題。通過抵消不同元素的方式找到候選眾數。
def majorityElement(nums):
candidate = None
count = 0
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
復雜度分析: - 時間復雜度:O(n),單次遍歷 - 空間復雜度:O(1)
要求:找出所有出現次數超過 ?n/3?
次的元素。
解法:擴展摩爾投票法,維護兩個候選數。
def majorityElement(nums):
candidate1, candidate2 = None, None
count1, count2 = 0, 0
for num in nums:
if num == candidate1:
count1 += 1
elif num == candidate2:
count2 += 1
elif count1 == 0:
candidate1 = num
count1 = 1
elif count2 == 0:
candidate2 = num
count2 = 1
else:
count1 -= 1
count2 -= 1
# 二次驗證
result = []
for candidate in [candidate1, candidate2]:
if nums.count(candidate) > len(nums) // 3:
result.append(candidate)
return result
當數據以流的形式輸入且無法存儲全部數據時,可使用空間優化的哈希表或抽樣統計法。
None
或拋出異常)[1,2,3]
需要特殊處理1.0
和 1
是否算相同)GROUP BY + COUNT
組合)方法 | 適用場景 | 時間復雜度 | 空間復雜度 |
---|---|---|---|
哈希表 | 通用眾數問題 | O(n) | O(n) |
排序法 | 多數元素問題 | O(n log n) | O(1) |
摩爾投票法 | 出現次數過半的眾數問題 | O(n) | O(1) |
推薦選擇: - 面試優先選擇摩爾投票法(考察算法思維) - 工程實踐可考慮哈希表(代碼可讀性高) “`
(注:全文約1200字,可根據需要增減代碼示例或詳細說明部分)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。