題目描述:
設(shè)計一個找到數(shù)據(jù)流中第K大元素的類(class)媚狰。注意是排序后的第K大元素型檀,不是第K個不同的元素憎妙。
你的 KthLargest 類需要一個同時接收整數(shù) k 和整數(shù)數(shù)組nums 的構(gòu)造器甚纲,它包含數(shù)據(jù)流中的初始元素口锭。每次調(diào)用 KthLargest.add,返回當(dāng)前數(shù)據(jù)流中第K大的元素介杆。
思路:
維護一個大小為K的小頂堆鹃操,當(dāng)堆不滿時,直接將元素添加進來春哨。當(dāng)堆滿時荆隘,比較新來的元素和最小堆堆頂?shù)拇笮。绻∮诟氨常瑒t直接丟棄椰拒,如果大于則將最小堆堆頂丟棄,新元素入堆凰荚,重新調(diào)整堆即可燃观。
class KthLargest {
PriorityQueue<Integer> queue ;
int k;
public KthLargest(int k, int[] nums) {
this.k = k;
queue = new PriorityQueue<>(k);
for(int n: nums)
add(n);
}
public int add(int val) {
if(queue.size()<k)
queue.offer(val);
else if(queue.peek()<val){
queue.poll();
queue.offer(val);
}
return queue.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/