减治:主元素问题的最优解

减治:主元素问题的最优解

主元素问题:

设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。给出一个算法,判断A中是否存在主元素并输出

最优解思路:

利用了减治的思想,移出两个不同的数字,剩下数字构成的集合主元素不改变

主元素出现的次数>n/2 ,若两个不同的元素两两相抵消,最后若数组元素完全抵消,则不存在主元素,若没有完全抵消,则余下的元素可能为主元素(是否为主元素还需要进行检验,如(0,1,2)虽然剩下2,但并不存在主元素)

首先设C=A[0],计数值count=1,

从第二个元素开始扫描,若元素和C相同,则不需消除,计数值count加1,即现在有2个相同的数准备着与不同值相消

若元素不与C相同,若count>0,进行消去,count减1;
若count=0,即刚刚进行过消去,现在已没有为相消储备的元素,当前元素变为相消储备元素,count=1

若扫描完毕后,count=0,证明元素完全抵消,返回-1;
否则再对数组进行一次扫描,统计C值出现的次数,若大于数组长度的一半,则输出C

代码:

int search_main( int* A,int n )
{
	int c=A[0];
	int count=1;
	int i;
	for( i=1;i<n;i++ )
	{
		if( A[i]==c )
		{
			count++;
		}
		else
		{	
			if( count>0 )
				count--;
			else
			{
				c=A[i];
				count=1;
			}
		}
	}
	if(count>0)
		for( i=0,count=0;i<n;i++ )
		{
			if( c==A[i] )
			{
				count++;
			}
		}
	if( count>n/2 )
		return c;
	else
		return -1;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happy19991001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值