Решение проблемы :
Точки знаний:
-
Deque: оба конца очереди может быть структурой данных / из очереди.
-
Герметичный в питоне (DEQUE деке):
Добавление элементов
Deque поддерживает добавление элементов с любого конца.
- расширить () добавить несколько элементов с правого конца
- Append () добавляет элемент с правого конца
- extendleft (), чтобы добавить множество элементов с левым конца, обратите внимание на обратный ввод
- appendleft () добавляет элемент с левого конца
Получает элемент
- поп () Удаляет элемент с правой стороны
- popleft () удалить элемент из левой
ноты, Deque потокобезопасно, так что вы можете удалить элементы с обоих концов одновременно в разных потоках.
Вышеприведенная цитата из: https: //www.jianshu.com/p/6928e420edb0
Я думал, что этот вопрос:
- Основные элементы очереди в порядке в команде
- Deque внутренняя инициализации епдиеего элемент, за элемент в очереди, если элемент в очереди меньше, чем епдиеий В противном случае, элементы внутренней очереди из очереди обратно в очередь элемента; т.е. внутри деку элементы находятся в порядке убывания
- Назад в Deque правила элемента показан как два шага
- Это позволяет в режиме реального времени, чтобы определить основные элементы текущего максимальной внутренней очереди, наибольший элемент в команде и положения головы дека
Достичь: пакет питона с использованием очередей и дека очереди
код выглядит следующим образом :
import queue
class MaxQueue:
def __init__(self):
self.queue = queue.Queue()
self.deque = queue.deque()
def max_value(self):
return self.deque[0] if self.deque else -1
def push_back(self, value):
while self.deque and self.deque[-1] < value:
self.deque.pop()
self.deque.append(value)
self.queue.put(value)
def pop_front(self):
if not self.deque: return -1
ans = self.queue.get()
#判断双端队列是否和主队列首元素相等,如果相等,最大值队列元素出队
if ans == self.deque[0]:
self.deque.popleft()
return ans
Достижение 2: Использование списка очереди питона и Deque;
Код выглядит следующим образом:
class MaxQueue:
def __init__(self):
self.queue = []
self.max_queue = []
def max_value(self):
return self.max_queue[0] if self.max_queue else -1
def push_back(self, value):
while self.max_queue and self.max_queue[-1] < value:
self.max_queue = self.max_queue[0:-1]
self.max_queue.append(value)
self.queue.append(value)
def pop_front(self):
if not self.max_queue: return -1
ans = self.queue.pop(0)
#判断存储最大值的队列是否和主队列首元素相等,如果相等,最大值队列元素出队
if ans == self.max_queue[0]:
self.max_queue.pop(0)
return ans