「力扣」第 703 题:数据流中的第 k 大元素(简单)


「力扣」第 703 题:数据流中的第 k 大元素(简单)

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

你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。

示例:

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

说明:
你可以假设 nums 的长度 ≥ k-1k ≥ 1

Java 代码:

import java.util.PriorityQueue;

public class KthLargest {

    private PriorityQueue<Integer> minHeap;
    private int k;

    public KthLargest(int k, int[] nums) {
        this.minHeap = new PriorityQueue<>(k);
        this.k = k;
        int len = nums.length;

        for (int i = 0; i < len; i++) {
            add(nums[i]);
        }
    }

    // 注意特殊测试用例:nums 为空的情况,此时 minHeap.peek() 可能得到的值为空

    public int add(int val) {
        if (minHeap.size() < k) {
            minHeap.offer(val);
            return minHeap.peek();
        } else {
            Integer top = minHeap.peek();
            if (val <= top) {
                return top;
            } else {
                minHeap.poll();
                minHeap.offer(val);
                return minHeap.peek();
            }
        }
    }

    public static void main(String[] args) {
        int k = 1;
        int[] nums = new int[]{};
        KthLargest obj = new KthLargest(k, nums);
        obj.add(-3);
    }
}

(本文完)


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「分治算法」专题:概述与经典问题 「分治算法」专题:概述与经典问题
「分治算法」专题:概述与经典问题 (占位,以后再补充。) 「力扣」第 53 题:连续子数组的最大和参考资料:LeetCode 第 53 题:连续子数组的最大和。 要做第 95 题,得先完成第 96 题。 (本节完)
下一篇 
「力扣」第 104 题:求一棵二叉树的最大深度(简单) 「力扣」第 104 题:求一棵二叉树的最大深度(简单)
「力扣」第 450 题:删除二叉搜索树中的节点 中文网址:450. 删除二叉搜索树中的节点 ; 英文网址:450. Delete Node in a BST 。 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树
  目录