主元素问题

已知一个整数序列A= (a0, a1,…an-1), 其中0≤ai≤n (0≤i<n)。若存在ap1.ap2…=apm=x且m>n/2 (0≤pk≤n,1≤k≤m),则称x为A的主元素。例如,A=(0,5,5,3,5,7,5,5),则5为主元素,又如A=(0, 5, 5,3, 5, 1, 5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中, 请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素:否则输出-1。

思想:将第一个出现的元素num保存到c中,用count记录num出现的次数,初始时令count = 1。如果下一个遇到的元素仍然是num则将count加1,否则将count减1。如果此时count == 0,则将下一个元素保存到c中,并重置count为0。重复上述过程,直至扫描完全部元素。
判断此时的c是否为真正的主元素。统计c出现的次数,并保存到count中,如果count > n / 2,则是主元素,否则不是。
通俗来讲:就是不断消除两个不同的元素,最后剩的元素就是可能的主元素,然后再判断该可能的主元素个数是否大于n/2,若大于,则主元素就是该元素

int Majority(int A[], int n)
{
	int i, c, count = 1;
	c = A[0];
	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)
	{
		count = 0;
		for (i = 0; i < n; i++)
		{
			if (A[i] == c)
			{
				count++;
			}
		}
	}
	if (count > n / 2)	return c;
	else return -1;
}

复杂度:T(n) = O(n), S(n) = O(1)。
也可以使用栈的方式求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不关我事~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值