題目:
這題要求我們在給定的一個整數陣列中找到「多數元素」:一個出現次數超過 n/2
次的數字,其中 n
是陣列的長度。根據題意,這個陣列一定有一個多數元素。
用一個 candidate 變數來追蹤潛在的多數元素,同時用 hash table (unordered_map) 計數每個元素出現次數,
實作:
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> map;
int maxCount = 0;
int candidate = 0;
for (auto n : nums) {
map[n]++;
if (map[n] > maxCount) {
maxCount = map[n];
candidate = n;
}
}
return candidate;
}
};
時間複雜度:O(n)
空間複雜度:O(n)
上面解題思路是每個元素都有對應的計數,
那麼是不是我只要用一個計數變數追蹤記住最常出現的那個元素的次數就好,出現別的元素的話就減 1,當 count 下降到 0 表示有其他元素與目前的候選者出現次數相同,當 count 由 0 變成 1 時表示有新的候選者出現,這就是 Boyer-Moore 投票演算法的核心概念,
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 0;
int candidate = 0;
for (auto n : nums) {
if (count == 0)
candidate = n;
if (n == candidate)
count++;
else
count--;
// count += (n == candidate) ? 1 : -1;
// (n == candidate) ? count++ : count--;
}
return candidate;
}
};
時間複雜度:O(n)
空間複雜度:O(1)