Top k Largest Numbers II
Data Stream
, Priority Queue
, Heap
Medium
Question
Implement a data structure, provide two interfaces:
add(number)
. Add a new number in the data structure.
topk()
. Return the topk
largest numbers in this data structure.k
is given when we create the data structure.Example
Example1
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]
Example2
Input:
s = new Solution(1);
s.add(3)
s.add(10)
s.topk()
s.topk()
Output:
[10]
[10]
Explanation:
s = new Solution(1);
>> create a new data structure, and k = 1.
s.add(3)
s.add(10)
s.topk()
>> return [10]
s.topk()
>> return [10]
Analysis
与top k问题1类似,不太一样的一点在于动态添加,使用min heap来实现,能够比较好地通过更新min heap来记录top k。
当添加的元素数目在1 ~ k时,直接插入这一元素到min heap中; 当添加的元素数目超出k时,对于新添加的元素,需要与min heap的根进行比较,如果比minheap.peek()大,那么便删除根,添加该新元素。
Solution
Min-Heap + iterator()
public class Solution {
private PriorityQueue<Integer> minheap;
private int maxSize;
public Solution(int k) {
minheap = new PriorityQueue<Integer>();
maxSize = k;
}
public void add(int num) {
if (minheap.size() < maxSize) {
minheap.offer(num);
} else {
if (num > minheap.peek()) {
minheap.poll();
minheap.offer(num);
}
}
}
public List<Integer> topk() {
Iterator iter = minheap.iterator();
List<Integer> result = new ArrayList<Integer>();
while (iter.hasNext()) {
result.add((Integer) iter.next());
}
Collections.sort(result, Collections.reverseOrder());
return result;
}
};
Last updated
Was this helpful?