寻找所有帖子中,帖子总数超过一半的作者,每个作者的ID是唯一的。
第一种解法:将这些ID全部排序假设有N个,则第N/2项的ID一定是“水王”的ID。这里排序的时间最少需要NlogN。
第二种解法:可以采用分治的思想,每次删除2个不同的ID,则剩下的ID中,“水王”的ID出现次数仍然超过总数的一半。
拓展:有3个发帖很多的ID,他们发帖数目超过帖子总数N的1/4。找出他们的ID。
第一种解法:将这些ID全部排序假设有N个,则第N/2项的ID一定是“水王”的ID。这里排序的时间最少需要NlogN。
第二种解法:可以采用分治的思想,每次删除2个不同的ID,则剩下的ID中,“水王”的ID出现次数仍然超过总数的一半。
Type Find(Type *ID,int N)
{
Type candicate;
int time=0;
for(int i=0;i<N;i++)
{
if(time==0)
{
candicate=ID[i];
time=1;
}
else
{
if(ID[i]==candicate)
time++;
else
time--;
}
}
return candicate;
}
拓展:有3个发帖很多的ID,他们发帖数目超过帖子总数N的1/4。找出他们的ID。
void Find(Type *ID,int N,Type candicate[3])
{
int time[3]=0;
for(int i=0;i<N;i++)
{
if(time[0]==0)
{
candicate[0]=ID[i];
time[0]=1;
}
else if(time[1]==0)
{
candicate[1]=ID[i];
time[1]=1;
}
else if(time[2]==0)
{
candicate[2]=ID[i];
time[2]=1;
}
else if(candicate[0]==ID[i])
time[0]++;
else if(candicate[1]==ID[i])
time[1]++;
else if(candicate[2]==ID[i])
time[2]++;
else
{
time[0]--;
time[1]--;
time[2]--;
}
}
}