zoukankan      html  css  js  c++  java
  • 347. Top K Frequent Elements

    一、题目

      1、审题

      

      

      2、分析

        一个非空整形数组,返回数组中出现次数最多的 k 个数。 其中 1 <= k <= 不同的数值个数。

    二、解答

      1、思路

        方法一、

          ① 新建一个 List<Integer, Integer>[] : 其中数组下标表示频率(count);  List 为数字;

          ② 新建一个 Map<Integer, Integer>:  其中key: num; value: count;

          ③ 采用 Map 统计每个数字出现的频率; 遍历 Map 的key, 填充 List[] ;

          ④ List[] 的最后 k 个 元素即为所求。

        public List<Integer> topKFrequent(int[] nums, int k) {
        	// index: count; value: nums
        	List<Integer>[] bucket = new List[nums.length + 1];
        	// key: num; value: count
        	HashMap<Integer, Integer> frequencyMap = new HashMap<>();
        	
        	for(int n: nums)
        		frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
        	
        	for(int key: frequencyMap.keySet()) {
        		int frequency = frequencyMap.get(key);
        		if(bucket[frequency] == null)
        			bucket[frequency] = new ArrayList<>();
        		bucket[frequency].add(key);
        	}
        	
        	List<Integer> result = new ArrayList<>();
        	
        	for(int pos = bucket.length - 1; pos >= 0 && result.size() < k; pos--) {
        		if(bucket[pos] != null)
        			result.addAll(bucket[pos]);
        	}
        	
        	return result;
        }
    	
    

      

      方法二、

        采用  PriorityQueue 存储较小的数,则每次出队都是出去的最大数。则出队的数进行存储; 出队的 前 K 个即为所求。

          public List<Integer> topKFrequent2(int[] nums, int k) {
    		
    		// key: num; value: count
    		HashMap<Integer, Integer> frequencyMap = new HashMap<>();
    		for(int n: nums)
    			frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
    		
    		PriorityQueue<Entry<Integer, Integer>> maxHeap = new PriorityQueue<>(new Comparator<Entry<Integer, Integer>>() {
    			@Override
    			public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
    				return o1.getKey() - o2.getKey();
    			}
    		});
    		
    		for(Entry<Integer, Integer> entry: frequencyMap.entrySet())
    			maxHeap.add(entry);
    		
    		List<Integer> result = new ArrayList<>();
    		while(result.size() < k) {
    			Entry<Integer, Integer> entry = maxHeap.poll();
    			result.add(entry.getKey());
    		}
    		
    		return result;
    	}
    

      

  • 相关阅读:
    尽解powershell的workflow
    powershell玩转iis网站服务器
    Windows Terminal (Preview)治好了cmd,powershell的癌症
    博客园“NET Core 版博客系统”的运维浅见
    此贴告诉你:为啥shell脚本人,不建议学python
    关于revit的外部扩展存储
    Revit二次开发 屏蔽复制构件产生的重复类型提示窗
    xpath测试工具 xpath调试工具
    c# 防止重复运行 弹出已运行窗口并传递消息
    .NET APlayer播放器 demo
  • 原文地址:https://www.cnblogs.com/skillking/p/11188331.html
Copyright © 2011-2022 走看看