iT邦幫忙

2024 iThome 鐵人賽

0
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 41

經典LeetCode 169. Majority Element

  • 分享至 

  • xImage
  •  

題目:
這題要求我們在給定的一個整數陣列中找到「多數元素」:一個出現次數超過 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)

參考:
#169. Majority Element


上一篇
經典LeetCode 733: Flood Fill
下一篇
經典LeetCode 383. Ransom Note
系列文
刷經典 LeetCode 題目70
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言