---
# System prepended metadata

title: 'LeetCode #229 [Majority Element II](https://leetcode.com/problems/majority-element-ii)'
tags: [LeetCode, Medium]

---

###### tags: `LeetCode` `Medium`
# LeetCode #229 [Majority Element II](https://leetcode.com/problems/majority-element-ii)
### (Medium)
給定一個大小為 n 的整數數組，找出其中所有出現超過 ⌊ n/3 ⌋ 次的元素。
進階：嘗試設計時間複雜度為 O(n)、空間複雜度為 O(1)的算法解決此問題。


---
使用Boyer–Moore majority vote algorithm, nums[i]與候選數相同則計數器+1, 不同則-1, 若計數器為0則替換候選數。
遍歷nums後得到兩候選數, 在計算這兩個候選數個數是否大於n/3。


---
```
class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        if(nums.size()==1)return {nums[0];};
        else{
            int element1=0;
            int count1=0;
            int element2=0;
            int count2=0;
            for(int i=1;i<nums.size();i++){
                if(element1==nums[i])count1++;
                else if(element2==nums[i])count2++;
                else if(count2==0){
                    element2=nums[i];
                    count2=1;
                }
                else if(count1==0){
                    element1=nums[i];
                    count1=1;
                }
                else{
                    count1--;
                    count2--;
                }
            }
            count1=0;count2=0;
            for(int i=0;i<nums.size();i++){
                if(nums[i]==element1)count1++;
                else if (nums[i]==element2)count2++;
            }
            vector<int> ans;
            if(count1>(nums.size()/3))ans.push_back(element1);
            if(count2>(nums.size()/3))ans.push_back(element2);
            return ans;
        }
    }
};
```