offer2-60


给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

import java.util.Map;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> numMap = new HashMap<>();

        for (int num : nums) {
            if (!numMap.containsKey(num)) {
                numMap.put(num, 0);
            }
            numMap.put(num, numMap.get(num) + 1);
        }

        PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>(new Comparator<Pair<Integer, Integer>>(){
            @Override
            public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
                return -p1.getValue().compareTo(p2.getValue());
            }
        });

        for (Map.Entry<Integer, Integer> entry : numMap.entrySet()) {
            Pair<Integer, Integer> p = new Pair<>(entry.getKey(), entry.getValue());
            pq.add(p);
        }

        int[] result = new int[k];

        for (int i = 0; i < k; i++) {
            Pair<Integer, Integer> pair = pq.poll();
            result[i] = pair.getKey();
        }

        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !