zoukankan      html  css  js  c++  java
  • [LeetCode]347. 前 K 个高频元素(堆)

    题目

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

    示例 1:

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

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

    你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
    你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/top-k-frequent-elements
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    • 先遍历一遍记录各元素出现次数。
    • 使用小根堆维护前k个频率最高元素(因为超过k个需要当前元素和堆顶元素比较,决定去掉哪个,所以使用小根堆而不是大根堆),其中定义比较器使用根据HashMap得到的元素频率大小比较。

    代码

    class Solution {
    	public List<Integer> topKFrequent(int[] nums, int k) {
    		HashMap<Integer, Integer> map = new HashMap<>();
    		for (int num : nums) {
    			map.put(num, map.getOrDefault(num, 0) + 1);
    		}
    
    		PriorityQueue<Integer> minHeap = new PriorityQueue<>(new Comparator<Integer>() {
    			@Override
    			public int compare(Integer o1, Integer o2) {
    				return map.get(o1) - map.get(o2);
    			}
    		});
    
    		for (int key : map.keySet()) {
    			minHeap.add(key);
    			if (minHeap.size() > k) {
    				minHeap.poll();
    			}
    		}
    
    		List<Integer> list = new LinkedList<>();
    		for (int num : minHeap) {
    			list.add(num);
    		}
    		return list;
    	}
    }
    
  • 相关阅读:
    centos6下安装部署hadoop2.2
    centos 卸载自带的 java
    完全分布式Hadoop2.3安装与配置
    hadoop安装与WordCount例子
    CentOS 6.5 下载地址
    碎片化
    DRM加密技术是怎么一回事
    DRM你又赢了:其API纳入HTML5标准
    java 对视频和图片进行加密解密
    HadoopDB:混合分布式系统
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11802672.html
Copyright © 2011-2022 走看看