寻找发帖水王
《编程之美》的思路:如果一个ID的发帖数超过总数的一半,那么该ID在每个局部范围内也是超过一半的,因此用相互抵消的方法来确定发帖超过一半的ID。算法如下:
#include <stdio.h>#include <stdlib.h>#define NUM 10int 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--。