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) {
if(nums.size()==0)
return vector<int>();
vector<int> res;
if(nums.size()==1)
{
res.push_back(nums[0]);
return res;
}
int cnt1 = 0;
int cnt2 = 0;
int num1 = 0;
int num2 = 0;
cnt1 = 1;
num1 = nums[0];
for(int i=1; i<nums.size(); i++)
{
if(num1==nums[i])
{
cnt1++;
}else if(num2==nums[i])
{
cnt2++;
}else if(cnt1 == 0)
{
cnt1 = 1;
num1 = nums[i];
}else if(cnt2 == 0)
{
cnt2 = 1;
num2 = nums[i];
}else
{
cnt1--;
cnt2--;
}
}
cnt1 = 0;
cnt2 = 0;
for(int i=0; i<nums.size(); i++)
{
if(nums[i]==num1) cnt1++;
else if(nums[i]==num2) cnt2++;
}
if(cnt1>nums.size()/3) res.push_back(num1);
if(cnt2>nums.size()/3) res.push_back(num2);
return res;
}
};