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) {
int cnt[2] = {0};
int num[2] = {0};
vector<int> ret;
int i, j;
const int n = nums.size();
for (i = 0; i < n; ++i) {
if (cnt[0] > 0 && num[0] == nums[i]) {
cnt[0]++;
} else if (cnt[1] > 0 && num[1] == nums[i]) {
cnt[1]++;
} else if (cnt[0] == 0) {
cnt[0] = 1;
num[0] = nums[i];
} else if (cnt[1] == 0) {
cnt[1] = 1;
num[1] = nums[i];
} else {
cnt[0]--;
cnt[1]--;
}
}
if (cnt[0] > 0) {
for (i = 0, j = 0; i < n; ++i) {
if (nums[i] == num[0]) j++;
}
if (j > n/3) ret.push_back(num[0]);
}
if (cnt[1] > 0) {
for (i = 0, j = 0; i < n; ++i) {
if (nums[i] == num[1]) j++;
}
if (j > n/3) ret.push_back(num[1]);
}
return ret;
}
};