题意:在N个数字中找到出现次数超过(N+1) / 2的数
思路:
1.Hash统计出现次数,然后保存最多数的下标
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100005];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
memset(a,0,sizeof(a));
int m,Max = 0,Max_flag;
for(int i = 0; i < n; i++ )
{
scanf("%d",&m);
a[m]++;
if(a[m] > Max)
{
Max = a[m];
Max_flag = m;
}
}
printf("%d\n",Max_flag);
}
return 0;
}
思路二:这题数据小可以开数组,如果数据超过数组长度,如10000000000,就不能用这种方法了
那个出现最多的数字至少出现了(N+1) / 2 次,说明他能减去一半的数所以思路是,记录一个数字,判断他和下一个输入的数字是否相同,相同次数+1,不同次数-1,
如果次数变为0, 从新记录数字
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int time=0,ans,num;
while(n--)
{
cin>>num;
if(time==0)
{
ans=num;
time++;
}
else
{
if(num==ans)
time++;
else
time--;
}
}
cout<<ans<<endl;
}
return 0;
}