桶子计数

10 分钟

当数字的取值范围不大时,可以给每个可能的值准备一个“桶”——也就是数组的一格——来数它出现了几次。桶的下标就是数值本身,桶里存的是次数。

int cnt[10] = {0};          // 统计 0~9,共 10 个桶
for (int i = 0; i < n; i++)
    cnt[a[i]]++;            // a[i] 这个值又出现一次

要统计 ,就得开 个格子(下标 )。之后 cnt[3] 就是数字 出现的次数。复杂度 ,扫一遍就统计完,比排序后再数要快。

关键坑是下标越界:桶的大小必须 最大可能值 。如果值可能到 ,就要开 cnt[101];值从 开始,格子数正好是“最大值 ”。另一个限制是值域不能太大——若数值能到 ,开这么大的数组内存装不下,这时桶计数就不适用了,得换别的办法。

小纸条

要统计 0 到 9 每个数字出现几次,cnt 数组至少要多少格?

登录 后可看答案

桶子计数 · 考级冲刺 · op599 课程