我正在实现一个同时具有 popMin 和 popMax 方法的队列类。到目前为止,我已经使用两个优先级队列,但即使删除是 log(n) 时间,我也必须从另一个队列中删除,这是线性的。我知道可以使用二进制堆来实现双端优先级队列,但是如果我没记错的话,这需要线性时间来构建吗?有没有办法可以更有效地做到这一点?我也只能使用 Java 库类。
static class MinMaxQueue {
PriorityQueue<String> MinQueue = new PriorityQueue<String>();
PriorityQueue<String> MaxQueue = new PriorityQueue<String>(Collections.reverseOrder());
void push(String val) {
MinQueue.add(val);
MaxQueue.add(val);
}
String popMin() {
MaxQueue.remove(MinQueue.peek());
return MinQueue.remove();
}
String popMax() {
MinQueue.remove(MaxQueue.peek());
return MaxQueue.remove();
}
int size() {
return MinQueue.size();
}
}