Description:
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.
Solution:
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> rc;
if (nums.empty()) return rc;
int a, b;
int cnt1 = 0, cnt2 = 0;
auto sz = (int)nums.size();
for (int i = 0; i < sz; ++i) {
int cur = nums[i];
if (cnt1 == 0 || cur == a) {
++cnt1;
a = cur;
} else if (cnt2 == 0 || cur == b) {
++cnt2;
b = cur;
} else {
--cnt1;
--cnt2;
}
}
cnt1 = 0;
cnt2 = 0;
for (auto n : nums) {
if (n == a) ++cnt1;
else if (n == b) ++cnt2;
}
if (cnt1 > sz / 3) rc.push_back(a);
if (cnt2 > sz / 3) rc.push_back(b);
return rc;
}
};