題目連結:
題目意譯:
給定一個大小為 n 的整數陣列,找到所有出現多於 ? n/3 ? 次的元素。
限制:
1 ≦ nums.length ≦ 5 × 10 ^ 4
-10 ^ 9 ≦ nums[i] ≦ 10 ^ 9
進階:你可以在線性時間內且使用 O(1) 空間來解開本題嗎?
範例測資:
範例 1:
輸入: nums = [3,2,3]
輸出: [3]
範例 2:
輸入: nums = [1]
輸出: [1]
範例 3:
輸入: nums = [1,2]
輸出: [1,2]
解題思維:
以前是求出現多於 ? n/2 ? 次的元素。那個時候是使用了博耶—摩爾多數投票演算法(Boyer–Moore Majority Vote Algorithm)來解。那可以推廣到本題嗎?
答案是:可以。可以看到在本題的條件下,最多會有兩種出現多於 ? n/3 ? 次的元素。因此我們可以把「候選人」(當時是稱其為「衛冕者」)的數量變成兩位。
而現在每遇到一個「下一個」元素,看這個元素是不是候選人之一。如果是就把對應的候選人之「票數」(當時是稱其為「血量」) + 1;如果不是則看有沒有候選人的票數已經歸零了的,如果有則將現在的元素變成新的候選人,並設其票數為 1;如果也沒有,則直接將當前兩位候選人的票數各自減去 1。
不過一樣,最後留下的候選人不一定真的出現了超過 ? n/3 ? 次。所以要再掃過一次 nums 來統計這兩位候選人的實際出現數。如果某位候選人的實際出現數有超過 ? n/3 ?,才需要將該位候選人加到答案之中;反之則不用。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。