设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
class KthLargest { //小顶堆 private PriorityQueue<Integer> heap = null; private int k = 0; public KthLargest(int k, int[] nums) { this.heap = new PriorityQueue<>(); this.k = k; //遍历数组 for (int i = 0; i < nums.length; i++) { //先把堆填满(大小为k) if (heap.size() < k) { heap.offer(nums[i]); } //填满后,如果数组的值比堆顶大,去掉堆顶,然后把数组的值放到堆中(堆顶为最小值,也是第k大元素) else if (nums[i] > heap.peek()) { heap.poll(); heap.offer(nums[i]); } } } public int add(int val) { //如果堆没满,直接放入 if (heap.size() < k) { heap.offer(val); } //如果堆满了,比较添加的值和堆顶的大小 else if (val > heap.peek()) { heap.poll(); heap.offer(val); } return heap.peek(); } } /** * Your KthLargest object will be instantiated and called as such: * KthLargest obj = new KthLargest(k, nums); * int param_1 = obj.add(val); */把小顶堆的大小规定为k,如果比堆顶大,就放入,一直保持堆的大小为k,那么每次堆顶就为第k大元素。