发帖水王——找出数组中超一半的数
//不断找出两个不相同的数,然后把它们删掉,当再找不出不相同的数时,剩下的数就是过半的数
int findOverHalf(int *ID, int N)
{
int candicate;
int nTime, i;
for(i = nTime = 0; i < N; i++)
{
if(nTime == 0)
{
candicate = ID[i];
nTime = 1;
}
else
{
if(candicate == ID[i])
nTime--;
else
nTime++;
}
}
return candicate;
}
扩展,当有3个数,每一个的个数都超过总数的1/4时
借用上面的思想,只不过每次是找出四个不同的
struct candidate
{
void init()
{
aTimes = 0;
bTimes = 0;
cTimes = 0;
}
//需要判定多种情况:
//1.全部都为0
//2.部分为0
//3.全不为0
bool check_and_add(int num)
{
if(a == num && aTimes != 0) { aTimes++; return false;}
if(b == num && bTimes != 0) { bTimes++; return false;}
if(c == num && cTimes != 0) { cTimes++; return false;}
if(aTimes == 0) { a = num; aTimes = 1; return false;}
if(bTimes == 0) { b = num; bTimes = 1; return false;}
if(cTimes == 0) { c = num; cTimes = 1; return false;}
return true;
}
void del()
{
aTimes--;
bTimes--;
cTimes--;
}
int a, aTimes;
int b, bTimes;
int c, cTimes;
}person;
candidate findOverQuarter(int *ID,int N)
{
person.init();
for(int i = 0; i < N; i++)
if(person.check_and_add(ID[i]))
person.del();
return person;
}