【Lintcode】1281. Top K Frequent Elements

题目地址:

https://www.lintcode.com/problem/top-k-frequent-elements/description

给定一个数组,求其数字中出现频率前 k k 高的元素。题目保证 k k 小于等于数组中unique数字的个数。

可以用最小堆来做。先用一个哈希表记录每个数字出现的频率,然后用最小堆动态存储频率前 k k 大的元素,直到数组遍历完毕。代码如下:

import java.util.*;

public class Solution {
    /**
     * @param nums: the given array
     * @param k: the given k
     * @return: the k most frequent elements
     */
    public List<Integer> topKFrequent(int[] nums, int k) {
        // Write your code here
        // 先存储每个数字出现的频率
        Map<Integer, Integer> freq = new HashMap<>();
        for (int num : nums) {
            freq.put(num, freq.getOrDefault(num, 0) + 1);
        }
        // 开一个最小堆,频率低者优先级高
        PriorityQueue<Integer> minHeap = new PriorityQueue<>((i1, i2) -> freq.get(i1) <= freq.get(i2) ? -1 : 1);
        for (int num : freq.keySet()) {
            if (minHeap.size() < k) {
                minHeap.offer(num);
            } else {
                if (freq.get(num) > freq.get(minHeap.peek())) {
                    minHeap.poll();
                    minHeap.offer(num);
                }
            }
        }
        
        List<Integer> res = new ArrayList<>();
        res.addAll(minHeap);
        return res;
    }
}

时间复杂度 O ( n log k ) O(n\log k) ,空间 O ( n ) O(n)

发布了354 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105321673