T609552 【标记数组模板】寻找众数
解题思路
这道题目要求找出数组中出现次数最多的数字(众数),如果有多个数字出现次数相同且都是最多,则输出其中最小的那个数字。
方法思路
-
标记数组法:使用一个标记数组
vis来记录每个数字出现的次数。数组的索引代表数字本身,数组的值表示该数字出现的次数。 -
输入处理:读取数组长度
n,然后读取n个数字,每读取一个数字x,就将vis[x]的值加1。 -
寻找众数:遍历标记数组
vis,记录出现次数最多的数字。如果多个数字出现次数相同且都是最多,则选择最小的那个数字。
这种方法的时间复杂度为O(n),因为我们需要遍历整个数组一次进行统计,然后遍历标记数组一次寻找众数。
代码注释
#include<bits/stdc++.h> using namespace std; int n,x,vis[100005]; // 定义变量:n为数组长度,x为临时变量,vis为标记数组,记录每个数字出现的次数 int main() { //题目2:找出现最多次数的数字 cin >> n; // 读取数组长度n int maxx = 0,num = 0; // maxx记录当前最大出现次数,num记录对应的数字 for(int i = 1; i <= n; i++) // 循环读取n个数字 { cin >> x; // 读取当前数字x vis[x]++; // 将vis数组中x对应的位置的值加1,表示x出现次数增加 } for(int i = 0; i <= 100000; i++) // 遍历所有可能的数字(0到100000) { if(vis[i] > maxx){ // 如果当前数字i的出现次数大于maxx maxx = vis[i]; // 更新maxx为当前数字的出现次数 num = i; // 更新num为当前数字i } } cout << num; // 输出出现次数最多的数字 return 0; }

浙公网安备 33010602011771号