int* majorityElement(int* nums, int numsSize, int* returnSize){
int* res =(int*)calloc(2,sizeof(int));
*returnSize=0;
if (nums == NULL || numsSize == 0) return res;
// 初始化两个候选人candidate,和他们的计票
int cand1 = nums[0], count1 = 0;
int cand2 = nums[0], count2 = 0;
int i;
// 摩尔投票法,分为两个阶段:配对阶段和计数阶段
// 配对阶段
for (i=0; i<numsSize; i++) {
// 投票
if (cand1 == nums[i]) {
count1++;
continue;
}
if (cand2 == nums[i]) {
count2++;
continue;
}
// 第1个候选人配对
if (count1 == 0) {
cand1 = nums[i];
count1++;
continue;
}
// 第2个候选人配对
if (count2 == 0) {
cand2 = nums[i];
count2++;
continue;
}
count1--;
count2--;
}
// 计数阶段
// 找到了两个候选人之后,需要确定票数是否满足大于 N/3
count1 = 0;
count2 = 0;
for (i=0; i<numsSize; i++) {
if (cand1 == nums[i]) count1++;
else if (cand2 == nums[i]) count2++;
}
if (count1 > numsSize / 3)
res[(*returnSize)++]=cand1;
if (count2 > numsSize / 3)
res[(*returnSize)++]=cand2;
return res;
}