Swift教室 Swift と競技プログラミングの教室

09. Top K Frequent Elements

読了目安 約1分

Heap / LeetCode 347 (Medium) — 出現回数の多い上位 K 種類の値を求める。

この章の目次

問題

LeetCode 347. Top K Frequent Elements(Medium / カテゴリ: Heap)

整数の配列 nums と整数 k が与えられます。 出現回数が多い上位 k 種類の値を返してください。 答えは一意に決まる入力だけが与えられ、返す順序は問いません(テストコードはソートして比較します)。

考え方

ヒント 1

まず各値の出現回数を数えます。 Dictionary の counts[num, default: 0] += 1 が数え上げの定型句です。

ヒント 2

回数の降順に並べ替えて先頭 k 個を取れば O(n log n) です。 値の種類が多いときは、サイズ k の最小ヒープに(回数, 値)を入れていくと O(n log k) に落ちます。

Swift 実装のポイント

  • 辞書の sorted { $0.value > $1.value } で、キーと値のペアを回数の降順に並べられます。
  • prefix(k) は要素数が k 未満でもエラーにならず、あるだけ返します。
  • 面接ではソート解に加えて、最小ヒープで O(n log k) にする改善(703MinHeap と同じ道具)まで話せると強いです。
模範解答
Swift
class Solution {
    func topKFrequent(_ nums: [Int], _ k: Int) -> [Int] {
        var counts: [Int: Int] = [:]
        for num in nums {
            counts[num, default: 0] += 1
        }
        return counts.sorted { $0.value > $1.value }.prefix(k).map { $0.key }
    }
}

計算量: O(n log n) 時間、O(n) 追加メモリ(ヒープを使えば O(n log k) 時間)。