Deque with Minimum
Deque with Minimum
Задача
Реализовать дек, который поддерживает операции:
push_front(x)— добавить в началоpush_back(x)— добавить в конецpop_front()— удалить из началаpop_back()— удалить из концаget_min()— получить минимальный элемент
Идея: держим две структуры (две MinStack), но вместо «переливать всё как в очереди»
мы перебалансируем, когда одна из частей становится пустой (делаем размеры примерно одинаковыми).
Идея
Храним дек как две части:
L(left) — элементы ближе к началу дека (верх стека = front)R(right) — элементы ближе к концу дека (верх стека = back)
Тогда:
frontлежит на вершинеLbackлежит на вершинеR- минимум дека =
min(L.min, R.min)
Если нам надо удалить из стороны, но соответствующий стек пуст:
- собираем все элементы в правильном порядке,
- делим пополам,
- складываем обратно так, чтобы размеры
LиRбыли близки.