Como restaurar o PriorityQueue para seu estado inicial antes da chamada do método?
Estou fazendo um problema de práticaPratique a TI com o menor
Esse problema é basicamente transmitido em um PriorityQueue e em um certo k, e você deve retornar o k-menor valor nesse PriorityQueue. Você também deve restaurar o PriorityQueue para seu estado inicial e pode usar uma pilha ou fila como uma estrutura de dados auxiliar.
Meu pseudo-pensamento de nível superior é que, porque o PriorityQueue já atua como um heap mínimo, deJava PriorityQueue, tudo o que realmente preciso fazer (meu algoritmo) é:
Remova os elementos k do PriorityQueue
Armazene o k-menor valor como uma variável local
Empurre os elementos k removidos para uma pilha (pilha para que eu possa adicionar elementos na mesma ordem)
Retire todos os elementos da pilha e adicione-os novamente ao PriorityQueue
Retornar o k-ésimo valor menor
Aqui está o código para fazer tudo isso:
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;
}
}
Quando executo o programa, obtenho todas as saídas corretas, em termos de késimo menor, mas não consigo restaurar o estado do meu PriorityQueue. Por exemplo, ao transmitir um PriorityQueue de:
[-3, 9, 17, 22, 42, 81] with a k of 3
... meu algoritmo produz o resultado certo, 17, mas altera o estado do PriorityQueue para[-3, 17, 9, 81, 22, 42]
, o que é inesperado.
Pensei em fazer uma cópia do PriorityQueue, mas isso viola as condições: "você pode usar uma pilha ou fila como uma estrutura de dados auxiliar".
Como posso restaurar o estado do PriorityQueue?