#STL #map #枚举
问题描述
在一个n*m的矩阵中,有一个数字出现了超过一半的次数,请设计一个高效算法找到这个数字。
输入格式
输入第一行包含两个整数n和m,表示矩阵的大小(1<=n,m<=e3)。
接下来n行,每行包含m个正整数,表示矩阵中的元素。
输出格式
输出一个整数,表示矩阵中出现次数超过一半的数字。
样例输入
3 3
1 2 3
2 2 2
1 2 2
样例输入
2
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
map<int, int>mp;
int n, m;
cin >> n >> m;
for (int i = 1; i <= n * m; i++) {
int x;
cin >> x;
mp[x]++;
}
for (const auto &i : mp) {
if (i.second > n * m / 2.0) {
cout << i.first << endl;
}
}
return 0;
}
总结:
题解方法通过声明一个 map<int,int> mp
,用于统计每个元素出现的次数。
然后,从输入读取了两个整数 n
和 m
,分别表示矩阵的行数和列数。
随后,通过一个循环,从输入读取了 n * m
个数,将各个数字及其出现次数记录到 mp
中。
其中,mp[x]++
是对 map
容器中关键字为 a
的值进行递增操作。
在这个程序中,mp
是一个 map<int,int>
类型的变量,它将整数作为关键字,对应的值是该整数在输入中出现的次数。当我们执行 mp[x]++
时,它的作用是:
- 如果 x 在
mp
中不存在,那么会将a
添加到mp
中,并将它的初始值设置为0,然后进行递增操作,使其变为1。 - 如果 x 在
mp
中已经存在,那么直接对对应的值进行递增操作,使其增加1。
因此,mp[x]++
操作保证了我们可以正确地对 mp
中的值进行统计,记录每个元素出现的次数。
最后,再次遍历 mp
,如果某个数字的出现次数超过了 n * m
的一半,就输出该数字。
题解方法通过i.second,i.first 进行遍历,在每次迭代中,auto &i
绑定了一个指向当前键值对的引用。其中,i.first
表示当前键(也就是矩阵中的元素),i.second
表示当前值(也就是该元素在输入中出现的次数)。
也可以通过
for(const auto &[x,y]:mp)
{
if(2*y>n*m)
{
cout<<x<<endl;
}
}
const auto &[x, y]
,我们可以将每个键值对的键绑定到 x
,值绑定到 y
。然后,我们在 if(2*y>n*m)
中检查值的条件,并在满足条件时打印键。
整个程序的作用是找到矩阵中出现次数超过一半的元素,并输出这些元素。