同 5400,找出現次數 > n/2 的元素。假設一定存在。
| 方法 | 時間 | 空間 | 備註 |
|---|---|---|---|
| 暴力雙循環 | O(n²) | O(1) | 超時 |
| 哈希表統計 | O(n) | O(n) | 簡單通用 |
| 分治法 | O(n log n) | O(log n) | 遞歸合併 |
| Boyer-Moore 投票 | O(n) | O(1) | 最優解 |
維護候選元素 candidate 和計數器 count。
candidate = nums[0], count = 1。nums[i] == candidate,count++。count--。count == 0,更新 candidate = nums[i], count = 1。最終 candidate 即為多數元素(題目保證存在)。
class Solution {
public:
int majorityElement(vector& nums) {
int candidate = nums[0], count = 1;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == candidate) count++;
else if (--count == 0) { candidate = nums[i]; count = 1; }
}
return candidate;
}
};
再遍歷一次統計 candidate 實際出現次數,若 ≤ n/2 則無解。
將多數元素視為「陣營 A」,其餘為「陣營 B」。每次 A、B 互相抵消(count--),最終 A 因人數優勢必有剩餘。無論順序如何,A 最終計數 > 0。