Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
类似摩尔投票,用两个计数器,当前数字与计数器代表的数字都不同时,将两个计数器都减一
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int n = nums.size();
vector<int> a(2, 0), b(2, 0);
int index = 0;
for(auto x : nums){
if(b[0] == 0 || a[0] == x){
a[0] = x;
++b[0];
}
else if (b[1] == 0 || a[1] == x){
a[1] = x;
++b[1];
}
else{
--b[0];
--b[1];
}
}
vector<int> ans;
b[0] = b[1] = 0;
for(auto x : nums){
if(a[0] == x){
++b[0];
}
else if(a[1] == x){
++b[1];
}
}
if(b[0] > n / 3) ans.push_back(a[0]);
if(b[1] > n / 3) ans.push_back(a[1]);
return ans;
}
};