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

  

 

posted @ 2019-07-15 13:22  skillking2  阅读(58)  评论(0编辑  收藏