返回数据流中第k大的元素(Java)

题目描述

        设计一个类来查找流中第k大的元素。注意,它是排序后第k大的元素,而不是第k个不同的元素。
        您的KthLargest类将有一个构造函数,它接受一个整数k和一个整数数组nums,后者包含来自流的初始元素。对于每个对方法kthmaximum的调用。添加,返回表示流中第k大元素的元素。
Examples:

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8

解决

可以使用优先级队列,小顶堆,维护队列最大数量为k,每次add的时候,先判断队列是否已满,没满直接加入,满了就将要加入的数与堆顶的数(第k大的数)进行比较,没有堆顶大则不插入到堆中,比堆顶大先将堆顶元素弹出,如何插入该数,最后返回堆顶元素。
代码:

class KthLargest {
    public PriorityQueue<Integer> queue;
    public final int k;
    public KthLargest(int k, int[] nums) {
        queue = new PriorityQueue<>(k);
        this.k = k;
        for (int num : nums) {
            if(queue.size() < k){
                queue.add(num);
            }else{
                if(num > queue.peek()){
                    queue.poll();
                    queue.add(num);
                }
            }
        }
    }

    public int add (int val) {
        if(queue.size() < k){
            queue.add(val);
        }else if(val > queue.peek()){
            queue.poll();
            queue.add(val);
        }
        return queue.peek();
    }
}
发布了167 篇原创文章 · 获赞 263 · 访问量 12万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览