链接:https://vjudge.net/contest/163018#problem/B
题意
给n(奇数)个数,定义特殊的数为在序列中出现次数不少于(n+1)/2次的数,找出这个特殊的数
题目非常水,根本没有需要特殊考虑的情况
所以导致有好几种解法
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
//这也是编程之美和啊哈算法里的一道经典面试题目
const int mmax = 600100;
const int inf = 0x3f3f3f3f;
int dp[mmax],data[mmax],da[mmax];
int n,m,k;
int main()
{
while(cin>>n)
{
for(int i=1; i<=n; i++)
scanf("%d",&data[i]);
sort(data+1,data+1+n);
printf("%d\n",data[(n+1)/2]);
}
return 0;
}
解法2:
int main()
{
int n,x;
//cin>>n;
while(cin>>n)
{
int y,nn;
nn= n;
memset(a,0,sizeof(a));
while(nn--)
{
scanf("%d",&x);
a[x]++;
if(a[x]>=(n+1)/2)
{
y = x;
}
}
cout<<y<<endl;
}
}
利用桶排序,找出出现次数大于一半的数
解法3
int a[999999];
int main()
{
int n,x;
//cin>>n;
while(cin>>n)
{
int y,t=0;
stack<int>o;
while(n--)
{
scanf("%d",&x);
if(o.empty()){o.push(x);}
else if(o.top()==x){
o.push(x);
}
else o.pop();
}
cout<<o.top()<<endl;
}
}
也是o(n)的算法
同解法三,不过是手动模拟栈
int a[999999];
int main()
{
int n,x;
//cin>>n;
while(cin>>n)
{
int y,t=0;
while(n--)
{
scanf("%d",&x);
if(t==0)
{
t++;
y = x;
}
else if(x==y)t++;
else t--;
}
cout<<y<<endl;
}
}
注意以上算法只要题目稍微更改,比如 4 2 5 2 就会出错,只有桶排和第一种算法比较靠谱