Мне недавно задали этот вопрос в интервью, чтобы найти медиану из потока данных чисел, и я смог найти решение Priority Queue
, как показано ниже:
public class MedianFinder {
private final PriorityQueue<Long> min = new PriorityQueue<>();
private final PriorityQueue<Long> max = new PriorityQueue<>(Collections.reverseOrder());
public void addNum(long num) {
max.offer(num);
min.offer(max.poll());
if (max.size() < min.size()) {
max.offer(min.poll());
}
}
public double findMedian() {
if (max.size() == min.size())
return (max.peek() + min.peek()) / 2.0;
else
return max.peek();
}
}
Теперь интервьюер хотел меняоптимизировать метод addNum
, потому что в нем много операций O (log n) (около 5), и он хотел посмотреть, сможем ли мы еще оптимизировать его, чтобы у нас было меньше операций O (log n)?Есть ли что-то, что мы можем сделать здесь, чтобы оптимизировать метод addNum
?