《编程之美》的思路:如果一个ID的发帖数超过总数的一半,那么该ID在每个局部范围内也是超过一半的,因此用相互抵消的方法来确定发帖超过一半的ID。算法如下:
在get_post_king中如果ntimes已经为0,说明在已经遍历的部分,没有任何一个candidate是超过一半的,因此需要从当前元素ID[i]重新开始继续遍历,如果ID[i]和candidate相同,那么就ntimes++,如果不相同就ntimes--。
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int get_post_king(int ID[], int N){
int candidate,i,times;
for(times = i=0;i<NUM;i++){
if(times == 0){
candidate = ID[i];
times = 1;
}else{
if(candidate == ID[i])
times++;
else{
times--;
}
}
}
return candidate;
}
int main(){
int sample[NUM] = {6,6,6,4,5,6,6,9,8,6};
printf("%d\n",get_post_king(sample,NUM));
}
在get_post_king中如果ntimes已经为0,说明在已经遍历的部分,没有任何一个candidate是超过一半的,因此需要从当前元素ID[i]重新开始继续遍历,如果ID[i]和candidate相同,那么就ntimes++,如果不相同就ntimes--。