Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3] Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2] Output: [1,2]
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
if (nums.empty())
return {};
vector<int> res;
int first = 0, second = 0;
int countFirst = 0, countSecond = 0;
for (int i = 0; i < nums.size(); i ++) {
if (nums[i] == first)
countFirst ++;
else if (nums[i] == second)
countSecond ++;
else if (countFirst == 0)
countFirst = 1, first = nums[i];
else if (countSecond == 0)
countSecond = 1, second = nums[i];
else
countFirst --, countSecond --;
}
countFirst = 0, countSecond = 0;
for (int i = 0; i < nums.size(); i ++) {
if (nums[i] == first)
countFirst ++;
else if (nums[i] == second)
countSecond ++;
}
if (countFirst > nums.size()/3)
res.push_back(first);
if (countSecond > nums.size()/3)
res.push_back(second);
return res;
}
};