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
s = new Solution(3);
>> create a new data structure.
s.add(3)
s.add(10)
s.topk()
>> return [10, 3]
s.add(1000)
s.add(-99)
s.topk()
>> return [1000, 10, 3]
s.add(4)
s.topk()
>> return [1000, 10, 4]
s.add(100)
s.topk()
>> return [1000, 100, 10]
PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。
方法iterator()中提供的迭代器可能只是对整个数组的依次遍历。也就只能保证数组的第一个元素是最小的。
java
public class Solution {
/*
* @param k: An integer
*/
Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a - b;
}
};
PriorityQueue<Integer> heap = null;
int k = 0;
public Solution(int k) {
// do intialization if necessary
heap = new PriorityQueue<Integer>();
this.k = k;
}
/*
* @param num: Number to be added
* @return: nothing
*/
public void add(int num) {
// write your code here
if (heap.size() < k) {
heap.offer(num);
} else if (heap.size() >= k && num > heap.peek()) {
heap.poll();
heap.offer(num);
}
}
/*
* @return: Top k element
*/
public List<Integer> topk() {
// write your code here
List<Integer> list = new ArrayList<>();
Iterator<Integer> it = heap.iterator();
while (it.hasNext()) {
list.add(it.next());
}
Collections.sort(list, Collections.reverseOrder());
return list;
}
}