主元素问题

给定含有n 个元素的多重集合S ={A1,A2,…,An},1<=Ai<=n,1<=i<=n,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数大于n/2 的元素称为主元素。
例如,S = {2,2,4,2,1,2,5,2,2,8}。
多重集S 的主元素是2,其重数为6。
现在给定一个n 个元素的多重集合S ={A1,A2,…,An},1<=Ai<=n,1<=i<=n,计算S的主元
素。

★数据输入

输入数据两行。
第一行一个正整数n(1<=n<=400000),表示多重集合S 中元素的个数。
第二行有n个正整数(每两个数字含一个空格)。

★数据输出

若多重集合存在主元素,输出主元素,否则输出 0。

该题实际上是找到主元素问题,主元素是指在数组中数量超过总元素一半的元素,找主元素我用的方法是假设一个元素为主元素X,遍历这个数组,如果与X相同则cnt计步器++,如果不同的情况下,cnt=1时就更新X,cnt重置为1,cnt!=1时,则cnt--,最后得到的就是主元素,但是我们还得对主元素进行判断,我们将计步器重置为0,遍历数组与主元素相比较,相同cnt++,最后看cnt是否超过(n/2)。

代码如下:

#include<iostream>
using namespace std;
int main()
{
	int n=0;
	cin>>n;
	
	int a[n];//输入数组 
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	
	int result=a[0];//假设第一个元素为主元素X 
	int cnt=1;//cnt从1开始是因为无论X是谁都至少有一个 
	
	for(int j=1;j<n;j++)//开始遍历数组与假设的X作对比 
	{
		if(a[j]==result){
			cnt++;//如果与假设的X相同cnt++ 
		}else if(cnt==1){
			result=a[j];//与X不同但cnt=1,说明假设错误,更新X,重置cnt 
			cnt=1;
		}else{
			cnt--;//与X不同且cnt!=1,cnt-- 
		}
	}
	cnt=0;
	for(int k=0;k<n;k++)//遍历数组,检查找出来的X在数组中是否超过(n/2) 
	{
		if(a[k]==result)
		cnt++;
	}
	if(cnt>(n/2)){
		cout<<result<<endl;
	}else cout<<"0"<<endl;
	
	return 0;
}

欢迎更多解题方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值