這題是面試中常見的經典題目,要求從一個陣列裡找出出現次數超過一半的元素,也就是所謂的「眾數」。為了更好理解,會先用一個直觀、易懂的方式來解釋問題,透過哈希表的方法來找出答案。接著,我會介紹一個更快、更有效率的解法,也就是 Boyer-Moore 多數投票算法。
我們可以使用一個哈希表(例如 C++ 中的 unordered_map
)來記錄每個元素出現的次數。遍歷陣列時,對每個元素進行計數,然後檢查該元素的出現次數是否超過 n/2。
其中 n 是陣列的長度。我們只需遍歷一次陣列。
class Solution {
public:
int majorityElement(vector<int>& nums) {
std::unordered_map<int, int> countMap;
int majorityCount = nums.size() / 2;
for (int num : nums) {
++countMap[num];
if (countMap[num] > majorityCount) {
return num;
}
}
// 根據題意,眾數一定存在,因此這裡不需要額外處理
return -1; // 這行實際上永遠不會被執行
}
};
unordered_map<int, int> countMap
來存儲每個數字及其出現次數。for (int num : nums)
遍歷每個元素。Boyer-Moore 多數投票算法是一種線性時間、常數空間的算法。核心思想是:
candidate
,初始為陣列的第一個元素。count
,初始為 1。candidate
相同的元素時,count
加 1;否則,count
減 1。count
為 0 時,將當前元素設為新的 candidate
,count
重置為 1。candidate
即為眾數。其中 n 是陣列的長度。我們只需遍歷一次陣列。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0];
int count = 1;
for (size_t i = 1; i < nums.size(); ++i) {
if (count == 0) {
candidate = nums[i];
count = 1;
} else if (nums[i] == candidate) {
++count;
} else {
--count;
}
}
return candidate;
}
};
candidate
即為眾數。以上是 Hua 在 LeetCode 的解題分享,有想法或是建議歡迎在底下討論。
Day Day Good, Day Day Up !