30_703. 数据流中的第K大(小)元素


题目描述:
image
image
解题思路:

关于TopK的问题,可以使用优先队列、二叉搜索树、快速选择来解决

  • 优先队列:nlogk
    • 使用小根堆解决最大的K个数
    • 使用大根堆解决最小的K个数

代码:
优先队列:

第K大元素
//第K大元素
class KthLargest {
    private int k;

    PriorityQueue pq = new PriorityQueue<>();
    public KthLargest(int k, int[] nums) {
        this.k = k;
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            add(nums[i]);
        }
    }
    
    public int add(int val) {
        pq.offer(val);
        if (pq.size() > k) {
            pq.poll();
        }
        return pq.peek();
    }
}

最小的K个数
class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        int[] vec = new int[k];
        if (k == 0) { // 排除 0 的情况
            return vec;
        }
        PriorityQueue queue = new PriorityQueue(new Comparator() {
            public int compare(Integer num1, Integer num2) {
                return num2 - num1;
            }
        });
        for (int i = 0; i < k; ++i) {
            queue.offer(arr[i]);
        }
        for (int i = k; i < arr.length; ++i) {
            if (queue.peek() > arr[i]) {
                queue.poll();
                queue.offer(arr[i]);
            }
        }
        for (int i = 0; i < k; ++i) {
            vec[i] = queue.poll();
        }
        return vec;
    }
}