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; }