美文网首页
2021.2.11每日一题

2021.2.11每日一题

作者: Yaan9 | 来源:发表于2021-02-11 09:32 被阅读0次

    703. 数据流中的第 K 大元素

    设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

    请实现 KthLargest 类:
    KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
    int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

    示例:
    输入:
    ["KthLargest", "add", "add", "add", "add", "add"]
    [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
    输出:
    [null, 4, 5, 5, 8, 8]
    解释:
    KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
    kthLargest.add(3);   // return 4
    kthLargest.add(5);   // return 5
    kthLargest.add(10);  // return 5
    kthLargest.add(9);   // return 8
    kthLargest.add(4);   // return 8
    

    题解

    维护一个大小为K的小根堆,在初始化时,保证堆内元素个数不大于K。每次 add()添加元素的时候,将新元素加入到堆中,如果此时堆中的元素超过了 K,那么需要把堆中的最小元素(堆顶)弹出。此时堆顶的元素就是整个数据流中的第 K 大元素。这里使用PriorityQueue实现小根堆。

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

    相关文章

      网友评论

          本文标题:2021.2.11每日一题

          本文链接:https://www.haomeiwen.com/subject/svglxltx.html