给定含有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;
}
欢迎更多解题方法