Я делаю проблему с практикой Практика IT Kth Smallest
Эта проблема в основном вы переданы в PriorityQueue и некотором k, и вы должны вернуть k-е наименьшее значение в этом PriorityQueue. Вы также должны восстановить PriorityQueue в исходное состояние и можете использовать один стек или очередь в качестве вспомогательной структуры данных.
Мое псевдо-мышление более высокого уровня состоит в том, что, поскольку PriorityQueue уже действует как минимальная куча, от Java PriorityQueue, все, что мне действительно нужно делать ( мой алгоритм):
-
Удалите k элементов из PriorityQueue
-
Сохраните k-е наименьшее значение как локальную переменную
-
Нажмите удаленные элементы k на стек (Stack, чтобы я мог добавлять элементы в том же порядке)
-
Попасть все элементы из Stack и снова добавить их в PriorityQueue
-
Возвращает k-е наименьшее значение
Вот код, чтобы сделать все это:
public int kthSmallest(PriorityQueue<Integer> pQ, int k) {
if(k <= 0 || k > pQ.size()) {
throw new IllegalArgumentException();
} else {
Stack<Integer> aux = new Stack<Integer>();
int kThSmallest = -1;
for(int c=0;c<k;c++){
int element = pQ.remove();
if(c == k-1)
kThSmallest = element;
aux.push(element);
}
while(!aux.isEmpty())
pQ.add(aux.pop());
return kThSmallest;
}
}
Когда я запускаю программу, я получаю все правильные выходы в терминах k-го наименьшего числа, но я не могу восстановить состояние моего PriorityQueue. Например, при передаче в PriorityQueue:
[-3, 9, 17, 22, 42, 81] with a k of 3
... мой алгоритм дает правильный результат 17, но он меняет состояние PriorityQueue на [-3, 17, 9, 81, 22, 42]
, что неожиданно.
Я думал о создании копии PriorityQueue, но это нарушает одно из условий: "вы можете использовать один стек или очередь в качестве вспомогательной структуры данных".
Как я могу восстановить состояние PriorityQueue?