题目: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;
}