数组中出现最多的元素
发布时间: 2015年10月6日 10:35 时间限制: 1000ms 内存限制: 256M
给你一个数组,输出里面出现超过1/2的元素。保证有且只有一个解。
第一行是一个整数,表示测试数据的组数 n,n < 1000万
之后每一行都是一个整数。
输出出现超过1/2的那个数字。
复制
5 1 1 1 2 3
1
有很多种做法,写两种速度较高的
1.排一遍序,中间的那个元素就是出现次数超过1/2的,复杂度是排序的复杂度
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long int a[10000005];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
printf("%lld\n",a[n/2]);
return 0;
}
2.“寻找多数元素”,看不懂可以在网上搜一搜别人的
他是根据序列的一个特性来搞的:在原序列中去除两个不一样的数,那么在原序列中出现次过了1/2的数,在新序列中出现的次数也一定会超过1/2
不明白可以随便找个序列试试,试试就明白为什么了
做法就是从头遍历,因为对于一个元素,他的下一个元素一定是和他相同或和他不同,不同就把这俩都去掉,相同则需要在多找一个和这个元素不相同的来去掉
复杂度是On,应该是这种题目的最优解
要复习准备考试了。。。具体代码待补!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int temp,time=0,a;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(time==0)
{
time=1;
temp=a;
}
else if(temp==a)
{
time++;
}
else
{
time--;
}
}
cout<<temp<<endl;
}