Итак, в основном это очередь, реализованная в виде связанного списка (поправьте меня, если я ошибаюсь).Чтобы решить эту проблему, я просто изменил бы идею узла.Типичный узел будет иметь следующий указатель и значение.Измените это, чтобы иметь три элемента, nextPointer, value и minSoFar.Если вам не нравится идея изменения дизайна очереди, прочитайте этот алгоритм, и в конце я привел еще одну идею.
Я думаю, что это можно сделать в O (1) Хитрость заключается в том, что при обходе списка отслеживайте наименьший элемент, встречающийся до этой точки в списке, и сохраняйте его в текущем узле.Так, например, у вас есть следующая очередь
Голова в 5 и хвост в 13
5 | 7 | 6 | 9| 5 | 13 |
Моя измененная очередь будет содержать такие узлы, как
{5,5} | {7,6} | {6,6} | {9,9} | {13,13} |({nodeVal, minSoFar})
Теперь рассмотрим операцию, добавив 3 в очередь и удалив 13, очередь становится
{3,3} | {5,5} | {7,6} | {6,6} | {9,9} |
Поскольку 3 меньше текущего элемента головки, минимальное значение для элемента головки покаэто его значение
Рассмотрим еще один случай, когда вам нужно добавить 15 в очередь
{15,5} | {5,5} | {7,6} | {6, 6} | {9,9} |
Поскольку 15 больше текущего элемента головки, текущее минимальное значение становится равным 5.
Таким образом, чтобы найти минимальный элемент вочередь / список, все, что вам нужно сделать, это проверить элемент head, и сложность вашего времени будет O (1)
Если вы не хотите изменять очередь, поддерживайте параллельную очередь и сохраняйтеminValueSoFar в этой очереди и зеркальное отображение операций в этой очереди.