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) にする改善(703 の
MinHeapと同じ道具)まで話せると強いです。
模範解答
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) 時間)。