[R5C] 众数

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 计数

数据规模:1n1061 \le n \le 10^61Ai1071 \le A_i \le 10^7

思路

用数组 cnta[x]cnta[x] 统计数字 xxAA 中的出现次数,那么 B[i]=cnta[A[i]]B[i] = cnta[A[i]]

再用数组 cntb[y]cntb[y] 统计 BB 中每个值 yy 的出现次数,yy 的范围是 1n1 \sim n(出现次数不可能超过 nn)。BB 的众数就是使 cntb[y]cntb[y] 最大的 yy;扫描时用 >= 更新答案,即可在平局时取到最大的 yy

复杂度:时间 O(n+V)O(n + V)V=maxAiV = \max A_i),空间 O(V)O(V)

仓颉实现

import std.convert.*
import std.env.*

main() {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
    let cnta = Array<Int64>(10000001, { _ => 0 })
    for (v in a) {
        cnta[v] = cnta[v] + 1
    }
    let cntb = Array<Int64>(n + 1, { _ => 0 })
    for (v in a) {
        cntb[cnta[v]] = cntb[cnta[v]] + 1
    }
    var best: Int64 = 0
    var ans: Int64 = 0
    for (x in 1..(n + 1)) {
        if (cntb[x] >= best) {
            best = cntb[x]
            ans = x
        }
    }
    println(ans)
}