/*
* @lc app=leetcode id=229 lang=cpp
*
* [229] Majority Element II
*
* https://leetcode.com/problems/majority-element-ii/description/
*
* algorithms
* Medium (32.90%)
* Likes: 990
* Dislikes: 117
* Total Accepted: 110.4K
* Total Submissions: 335.1K
* Testcase Example: '[3,2,3]'
*
* 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) {
const int N = nums.size();
int a = 0, b = 0, ca = 0, cb = 0;
for (const auto num : nums) {
if (num == a) ++ca;
else if (num == b) ++cb;
else if (ca == 0) {
a = num;
ca = 1;
} else if (cb == 0) {
b = num;
cb = 1;
} else {
--ca;
--cb;
}
}
ca = 0; cb = 0;
for (const auto num : nums) {
if (num == a) ++ca;
else if (num == b) ++cb;
}
vector<int> res;
if (ca > N / 3) res.push_back(a);
if (cb > N / 3) res.push_back(b);
return res;
}
};