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.
题目解析:根据题目描述,我们知道一个数组中最多两个满足要求的结果。
因此,这里可以用投票法,每个满足要求的数的个数都大于不满足要求的个数,转换为了一个众数的情况。
源代码:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* majorityElement(int* nums, int numsSize, int* returnSize) {
int res1 = 0;
int res2 = 0;
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < numsSize; ++i) {
if (nums[i] == res1) cnt1++;
else if (nums[i] == res2) cnt2++;
else if (cnt1 == 0) {
cnt1 = 1;
res1 = nums[i];
}
else if (cnt2 == 0) {
cnt2 = 1;
res2 = nums[i];
}
else {
cnt1--;
cnt2--;
}
}
// check
cnt1 = 0;
cnt2 = 0;
if (res1 == res2) res2 = res1 - 1;
for (int i = 0; i < numsSize; ++i) {
if (nums[i] == res1) cnt1++;
if (nums[i] == res2) cnt2++;
}
int* r;
if (cnt1 > numsSize/3 && cnt2 > numsSize / 3) {
*returnSize = 2;
r = (int*)malloc(2 * sizeof(int));
r[0] = res1;
r[1] = res2;
}
else if (cnt1 > numsSize / 3) {
*returnSize = 1;
r = (int*)malloc(1 * sizeof(int));
r[0] = res1;
}
else if (cnt2 > numsSize / 3) {
*returnSize = 1;
r = (int*)malloc(1 * sizeof(int));
r[0] = res2;
}
else {
*returnSize = 0;
r = NULL;
}
return r;
}