[題解]LeetCode 229. 求眾數 II(C++)
阿新 • • 發佈:2021-10-24
題目
給定一個大小為n的整數陣列,找出其中所有出現超過⌊ n/3 ⌋次的元素。
示例1:
輸入:[3,2,3]
輸出:[3]
示例 2:
輸入:nums = [1]
輸出:[1]
示例 3:
輸入:[1,1,1,3,3,2,2,2]
輸出:[1,2]
提示:
- \(1 <= nums.length <= 5 * 10^4\)
- \(-10^9 <= nums[i] <= 10^9\)
進階:嘗試設計時間複雜度為 O(n)、空間複雜度為 O(1)的演算法解決此問題。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/majority-element-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路
直接用雜湊表記錄數組裡出現過的元素,然後遍歷雜湊表查找出現次數超過 ⌊ n/3 ⌋ 次的元素插入返回的陣列。
時間複雜度O(n),空間複雜度O(n)。
程式碼
class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> ans; int n = nums.size(); unordered_map<int, int> m; for(const auto& x : nums) { m[x]++; } for(const auto& it : m) { if(it.second > n/3) { ans.emplace_back(it.first); } } return ans; } };
改進
用Moore投票法,和n/2不同的就是要設兩個數。
時間複雜度O(n),空間複雜度O(1)。
程式碼
class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> ans; int ele1 = 0; int ele2 = 0; int vote1 = 0; int vote2 = 0; for(const auto& n : nums) { if(vote1 > 0 && n == ele1) { ++vote1; } else if(vote2 > 0 && n == ele2) { ++vote2; } else if(vote1 == 0) { ele1 = n; ++vote1; } else if(vote2 == 0) { ele2 = n; ++vote2; } else { --vote1; --vote2; } } int cnt1 = 0; int cnt2 = 0; for(const int& n : nums) { if(n == ele1) { ++cnt1; } else if(n == ele2) { ++cnt2; } } if(cnt1 > nums.size()/3) ans.emplace_back(ele1); if(cnt2 > nums.size()/3) ans.emplace_back(ele2); return ans; } };