- Top k Largest Numbers II
中文English
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]
Explanation:
s = new Solution(3);
create a new data structure, and k = 3.
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]
解法1:minHeap。
注意:
1)像这种动态添加的问题只能用minHeap,不能用quickSelect()。
2)priority_queue好像没有iterator,不能遍历?所以我用了一个copy。也可以不用copy,将minHeap的元素一个个pop出来放到result里面之后再把result里面的元素push回minHeap。
代码如下:
class Solution {
public:
/*
* @param k: An integer
*/
Solution(int k) {
this->k = k;
}
/*
* @param num: Number to be added
* @return: nothing
*/
void add(int num) {
if (minHeap.size() < k) {
minHeap.push(num);
} else {
if (num > minHeap.top()) {
minHeap.push(num);
minHeap.pop();
}
}
}
/*
* @return: Top k element
*/
vector<int> topk() {
vector<int> result;
priority_queue<int, vector<int>, greater<int>> minHeap2 = minHeap;
while(minHeap2.size() > 0) {
int top = minHeap2.top();
minHeap2.pop();
result.push_back(top);
}
reverse(result.begin(),result.end());
return result;
}
private:
priority_queue<int, vector<int>, greater<int>> minHeap;
int k;
};