发帖水王

寻找所有帖子中,帖子总数超过一半的作者,每个作者的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]--;
		}
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值