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.
Extended version of http://blog.csdn.net/github_34333284/article/details/51118586
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
vector<int> majorityElement(vector<int>& nums) {
int count1 = 0;
int count2 = 0;
int target1 = INT_MIN;
int target2 = INT_MIN;
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] == target1) {
count1++;
} else if(nums[i] == target2) { // the if-else if- else sequence matters!
count2++;
} else if(count1 == 0) {
target1 = nums[i];
count1++;
} else if(count2 == 0) {
target2 = nums[i];
count2++;
} else {
count1--;
count2--;
}
}
vector<int> res;
count1 = 0, count2 = 0;
for(auto num : nums) {
if(num == target1) count1++;
else if(num == target2) count2++;
}
if(count1 > nums.size() / 3) res.push_back(target1);
if(count2 > nums.size() / 3) res.push_back(target2);
return res;
}
int main(void) {
vector<int> nums{1, 2, 2, 3, 2, 1, 1, 3};
vector<int> res = majorityElement(nums);
cout << res[0] << endl;
cout << res[1] << endl;
}