Kth Largest Element in a Stream
题目描述:设计一个找到数据流中第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 ) ;
kthLargest. add ( 5 ) ;
kthLargest. add ( 10 ) ;
kthLargest. add ( 9 ) ;
kthLargest. add ( 4 ) ;
说明:
你可以假设 nums 的长度≥ k- 1 且k ≥ 1 。
解题思路:刚开始想到使用set,因为set本身有序,但是忘了set是不允许相同元素的,于是使用multiset,但是借鉴了别人思路,发现使用优先队列更为巧妙,priority_queue,模仿小根堆的思路,只存当前前K大的数据,然后对头就是第K大的数据,始终保持优先队列的大小是k即可,如果大小超过k,那么就要出队(即当前最小的要出队),优先队列的使用情景。
class KthLargest {
public :
priority_queue< int , vector< int > , greater< int >> p_q;
int size;
KthLargest ( int k, vector< int > & nums) {
size= k;
for ( int i= 0 ; i< nums. size ( ) ; i++ ) {
p_q. push ( nums[ i] ) ;
if ( p_q. size ( ) > size) p_q. pop ( ) ;
}
}
int add ( int val) {
p_q. push ( val) ;
if ( p_q. size ( ) > size) p_q. pop ( ) ;
return p_q. top ( ) ;
}
} ;