题目地址:
https://www.lintcode.com/problem/top-k-largest-numbers-ii/description
实现一个数据结构,可以在线add数,返回Top K大的数。可以用最小堆实现。如果堆的size不到K则直接加入,否则比较一下新来的数与堆顶的大小,若新来的数更大,则poll掉堆顶,将新来的数入堆。代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class Solution {
private PriorityQueue<Integer> minHeap;
private int k;
/*
* @param k: An integer
*/
public Solution(int k) {
// do intialization if necessary
minHeap = new PriorityQueue<>(k);
this.k = k;
}
/*
* @param num: Number to be added
* @return: nothing
*/
public void add(int num) {
// write your code here
if (minHeap.size() < k) {
minHeap.offer(num);
} else {
if (num > minHeap.peek()) {
minHeap.poll();
minHeap.offer(num);
}
}
}
/*
* @return: Top k element
*/
public List<Integer> topk() {
// write your code here
List<Integer> res = new ArrayList<>(minHeap);
res.sort((i1, i2) -> i1 > i2 ? -1 : 1);
return res;
}
}
空间复杂度 O ( k ) O(k) O(k),时间复杂度,add是 O ( log k ) O(\log k) O(logk),topk是 O ( k log k ) O(k\log k) O(klogk)。