题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805422639136768
【分析】
题意:M*N长度的序列中找出出现次数大于规格一半的数字。
思路:摩尔投票算法或者map映射来做。
- 摩尔投票:定义候选次数最多的值,以及计数变量cnt,在一次次的比较中,若两值相等cnt++,否则cnt--直到cnt减到0再对候选值重新赋值。最后的候选值就是要求的值。
- map:map<int, int>,注意退出循环的条件
【代码】
摩尔投票:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int cnt=0,color=-1;//计数器和候选值
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int tmp;
scanf("%d",&tmp);
if(color!=tmp)
{
if(cnt==0)
color=tmp;//重新赋值
else cnt--;
}
else cnt++;
}
}
printf("%d\n",color);
return 0;
}
map:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int half=m*n/2;
map<int,int>cnt;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int tmp;
scanf("%d",&tmp);
cnt[tmp]++;
if(cnt[tmp]>half)
{
printf("%d\n",tmp);
return 0;
}
}
}
return 0;
}