数组频率计数将值作为下标,用整型数组直接统计,时间复杂度o(n);适用于范围小且已知的整数,如成绩0–100、骰子1–6、玩家id1–10000;需预分配大小为m+1的数组,负数或超大数不适用。

用数组做频率计数,核心是把“值”当“下标”,让数组本身变成一张简易的计数表。它不依赖哈希结构,逻辑直白、执行飞快,特别适合整数范围明确、波动不大的场景。
适用前提:数据范围小且已知
比如统计学生成绩(0–100分)、骰子点数(1–6)、玩家ID(1–10000)这类固定区间的数据。只要最大值 M 能预估,就可声明大小为 M+1 的整型数组(下标 0 到 M),初始化全为 0。
- 若输入值为 5,直接执行
count[5]++ - 若输入是负数、超大数(如 1e9)或字符串,此法失效,应换用哈希表
- 示例中 player 编号 1–10000,就开
vector<int> count(10001, 0)</int>,安全覆盖所有合法下标
关键操作:一次遍历完成统计
读入每个原始数据后,不做比较、不排序,只做两件事:校验范围 → 下标自增。整个过程时间复杂度 O(n),远优于嵌套循环的 O(n²) 暴力法。
- 伪代码:
if (x >= 1 && x - 无需额外存储原始数组,边读边计,空间更省
- 多组测试时,每次循环新建 vector 是好习惯;若复用同一数组,记得用
fill()或assign()清零
结果提取:从计数表反推规律
统计完,count[i] 就是数值 i 出现的次数。这时可快速回答多种问题:
- 找最高频:遍历 count 数组,记录最大值及其下标
- 找次高频:先得最大频次 max1,再扫一遍找
count[i] max2 - 查特定值频次:直接
count[7]返回 7 出现几次,O(1) 完成 - 输出所有频次为 k 的值:循环 i,判断
count[i] == k即可
注意边界与陷阱
看似简单,出错常在细节:
-
数组越界:下标从 0 开始,但若数据最小是 1,就别用
count[0]存 1 的频次——要对齐,即count[x]对应 x 本身 - 未初始化:C/C++ 中局部数组不自动清零,必须显式赋 0,否则含随机值
- 内存权衡:开 10001 个 int 约占 40KB,对现代设备微不足道,但若范围是 1–1e8,就不现实了










