設計一個找到數據流中第 K 大元素的類(class)。注意是排序後的第 K 大元素,不是第 K 個不一樣的元素。數組
你的 KthLargest
類須要一個同時接收整數 k
和整數數組 nums
的構造器,它包含數據流中的初始元素。每次調用 KthLargest.add
,返回當前數據流中第 K 大的元素。spa
示例:設計
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-1
且 k
≥ 1。code
解答:維護一個大根堆和一個小根堆,小根堆存放最大的K-1個元素,大根堆存放剩餘的元素。當小根堆放入第K個元素後,取出小根堆堆頂元素放入大根堆。所以小根堆內元素個數永遠是k-1,大根堆的堆頂元素就是咱們要的第K大元素blog
class KthLargest { private PriorityQueue<Integer> bigHeap; private PriorityQueue<Integer> smaHeap; public KthLargest(int k, int[] nums) { bigHeap = new PriorityQueue<>((o1,o2)->o2.compareTo(o1)); smaHeap = new PriorityQueue<>((o1,o2)->o1.compareTo(o2)); for(int i=0;i<k-1;i++){ smaHeap.offer(nums[i]); } for(int i=k-1;i<nums.length;i++){ smaHeap.offer(nums[i]); bigHeap.offer(smaHeap.poll()); } } public int add(int val) { smaHeap.offer(val); bigHeap.offer(smaHeap.poll()); return bigHeap.peek(); } }