实现一个数据结构,提供下面两个接口
1.add(number)
添加一个元素
2.topk()
返回前K大的数
样例
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]
解题思路:
与Lintcode 544. 前K大数类似。需要注意在topk方法中,可直接利用List的构造函数将PriorityQueue的值复制进List,然后按照倒序排序即可。
public class Solution {
PriorityQueue<Integer> pq = new PriorityQueue<>();
int k;
/*
* @param k: An integer
*/public Solution(int k) {
// do intialization if necessary
this.k = k;
}
/*
* @param num: Number to be added
* @return: nothing
*/
public void add(int num) {
// write your code here
pq.offer(num);
if(pq.size() > k)
pq.poll();
}
/*
* @return: Top k element
*/
public List<Integer> topk() {
// write your code here
List<Integer> res = new ArrayList<>(pq);
Collections.sort(res, Collections.reverseOrder());
return res;
}
}