编程之美2.3——发帖水王(+扩展)

发帖水王——找出数组中超一半的数
//不断找出两个不相同的数,然后把它们删掉,当再找不出不相同的数时,剩下的数就是过半的数

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值