技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

leetCode:347. Top K Frequent Elements

leetCodeの「347. Top K Frequent Elements」を解いた。
https://leetcode.com/problems/top-k-frequent-elements/

Map#getOrDefault() や PriorityQueue など、今後も使えそうなテクニックが幾つか出てくるので、参考のためここに解答を残しておく。

    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> numToCount = new HashMap<>();
        for (int num : nums) {
            // getOrDefault を使うと、hash における key の有無にかかわらず、以下の一行で書ける。便利。
            numToCount.put(num, numToCount.getOrDefault(num, 0) + 1);
        }

        // Map.Entry の各項目の value の昇順でソート。
        // PriorityQueue にラムダ式 (関数インタフェースを実装したものに相当) を与えることで実現している。
        PriorityQueue<Map.Entry<Integer, Integer>> minHeap
                = new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());
        for (Map.Entry<Integer, Integer> entry : numToCount.entrySet()) {
            minHeap.offer(entry);
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }

        int[] result = new int[k];
        for (int i = 0; i < k; i++) {
            result[i] = minHeap.poll().getKey();
        }
        return result;
    }