int FindWateringId(int Id[],int M)
{
int WateringId;
int times=0;
if(0==M) //还要判断输入数目是否有效
return false;
for(int i=0;i<M;i++)
{
if(times==0)
{
WateringId=Id[i];
times=1;
}
else
{
if(WateringId==Id[i])
times++;
else
times--;
}
}
times=0;
for(i=0;i<M;i++) //用来检测是否真的存在times>N/2的id
{
if(Id[i]==WateringId)
times++;
}
if(times*2<=M) //ID数量大于N/2的水王不存在
IsExisted=0;
else
IsExisted=1;
return WateringId;
}
时间复杂度只是O(n),空间复杂度只是O(1)而已。很nice的算法。
可是如果水王发的帖子数目刚好等于帖子总数的一半,那你还可以用上述方法解决吗?肯定行的通,换汤不换药而已,只要略加转变就可以完美解决。排序+统计可以,Hash也可以,删除的思想还行的通吗?对半?那删除完了不是把WateringId给弄没了吗?恩,也不一定啊。
如果水王的帖子数是总数的一半,那么总数必然是偶数,剩余的最后两个ID肯定有一个是水王的,不是全部,是其中一个!只需要最后加以判断即可。只需要稍微添加一些代码。
int FindWateringId(int Id[],int M)
{
int WateringId;
int times=0;
if(0==M) //还要判断输入数目是否有效
return false;
for(int i=0;i<M;i++)
{
if(times==0)
{
WateringId=Id[i];
times=1;
}
else
{
if(WateringId==Id[i])
times++;
else
times--;
}
}
times=0;
int WateringId2=Id[M-1]; //假设最后一个是水王,总数目是偶数
for(i=0;i<M;i++)
{
if(Id[i]==WateringId)
times++;
}
if(times<M/2)
WateringId=WateringId2; //这才是真的水王
times=0;
for(i=0;i<M;i++) //用来检测是否真的存在times>N/2的id
{
if(Id[i]==WateringId)
times++;
}
if(times*2<M) //ID数量大于N/2的水王不存在
IsExisted=0;
else
IsExisted=1;
return WateringID;
}
此版本同样适用于大于N/2的水王。
当然还有一种办法是用两个水王变量来解决这个问题。真假水王,最后谁的帖子多,谁就是真的水王,当然数目还要是满足times>=N/2的。这个也当然可以编码实现。
int FindWateringId(int Id[],int M)
{
int WateringId;
int FWateringId;
int times=0;
int Ftimes=0;
if(0==M) //还要判断输入数目是否有效
return false;
for(int i=0;i<M;i++)
{
if(times==0)
{
WateringId=Id[i];
times=1;
}
else if(Ftimes==0&&WateringId!=Id[i])
{ //不能让WateringId和FWateringId相等
FWateringId=Id[i];
Ftimes=1;
}
else
{
if(WateringId==Id[i])
{
times++;
}
else if(FWateringId==Id[i])
{
Ftimes++;
}
else //同时减去,这下子 直接少了3个。
{
times--;
Ftimes--;
}
}
}
if(Ftimes>times)
WateringId=FWateringId; //这才是真水王
times=0;
for(i=0;i<M;i++) //用来检测是否真的存在times>N的id
{
if(Id[i]==WateringId)
times++;
}
if(times*2<M) //ID数量大于N/2的水王不存在
IsExisted=0;
else
IsExisted=1;
return WateringId;
}
突然某一天,水王哥不见了,出现了3个发帖量超过总数1/4的水哥,你还能快速的找到他们吗?排序+统计完全可以搞定,无非是多了几个变量而已。类似a个发帖量超过总数1/b的问题都可以这么解决,这就好像一道ACM题了。有时间可以编码试试。
OK,水王问题解决!