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

      

  • 相关阅读:
    开发细节
    html
    java学习
    Promise对象
    强制转换和隐式转换
    借助防抖解决输入框的非空校验
    setTimeout
    Symbol类型
    js API
    vue 使用mixin
  • 原文地址:https://www.cnblogs.com/skillking/p/11188331.html
Copyright © 2011-2022 走看看