寻找多数元素 使用寻找候选者的方法。

寻找数组中的多项元素有多种办法,直接暴力循环或者是先排序后寻找中间元素最坏的时间复杂度为nlogn。几天记录一个使用候选者的方法去寻找数组中的多项元素时间复杂度则为n+n即为n

与直接遍历循环查找最大的不同点是,寻找候选者的过程中我们定义一个count值,当遍历时数组值与我们的候选值相等时count++,如果不同则count–,这将缩短我们的遍历程度,无需从头遍历到尾部。在一个数组内部删除两个不相同的数则原序列中的多数元素依旧是新数组中的多数元素。

值得强调的是一个数是最后的候选数不代表是多项数,多项数的意思是个数超过n/2的数(n表示数组长度),12233则2和3都不是多项数所以最后需要遍历一次计算求出来的候选数是否大与n/2;

#include<stdio.h>
int A[8]={0,1,3,3,5,3,5,3};
int n=7;

int candidate(int m)
{
   int j=m,c=A[m],count=1;
  
while(j<n&&count>0)
{   j=j+1;
    if(c==A[j])count++;//通过计数可以提前完成遍历;
    else count--;
}
if(j==n)return c;
else return candidate(m+1);

}

int majority()
{
	int c=candidate(1);
	int count=0;
   //遍历完成候选数的计算 如果大与n/2则为多项数
for(int i=0;i<=n;i++)
{
if(c==A[i])
count++;
}
 if(count>n/2)
   return c;
   else return -1;
}

int main()
{
    int c = majority();
	
	if(c!=-1)
		printf("%d",c);
	else 
		printf("none");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值