Implement a data structure, provide two interfaces:
add(number)
. Add a new number in the data structure.topk()
. Return the top k largest numbers in this data structure. k is given when we create the data structure.
Example
Example1
Input:
s = new Solution(3);
s.add(3)
s.add(10)
s.topk()
s.add(1000)
s.add(-99)
s.topk()
s.add(4)
s.topk()
s.add(100)
s.topk()
Output:
[10, 3]
[1000, 10, 3]
[1000, 10, 4]
[1000, 100, 10]
思路:用minheap解决,每次num比heap.peek大,那么进入;
public class Solution {
/*
* @param k: An integer
*/
private PriorityQueue<Integer> pq;
private int k;
public Solution(int k) {
this.pq = new PriorityQueue<Integer>();
this.k = k;
}
/*
* @param num: Number to be added
* @return: nothing
*/
public void add(int num) {
if(pq.size() < k) {
pq.add(num);
} else {
if(num > pq.peek()){
pq.poll();
pq.add(num);
}
}
}
/*
* @return: Top k element
*/
public List<Integer> topk() {
List<Integer> result = new ArrayList<Integer>();
PriorityQueue temp = new PriorityQueue<Integer>();
while(!pq.isEmpty()){
int value = pq.poll();
temp.add(value);
result.add(0,value);
}
this.pq = temp;
return result;
}
}