Мы знаем, что push и pop являются операциями с постоянным временем [O (1), если быть точным].
Но когда мы думаем о get_min () [то есть, чтобы найти текущее минимальное число в очереди] обычнопервое, что приходит на ум, - это поиск по всей очереди каждый раз, когда делается запрос на минимальный элемент.Но это никогда не даст операции с постоянным временем, которая является главной целью проблемы.
Обычно это задают очень часто в интервью, поэтому вы должны знать хитрость
.нам нужно использовать еще две очереди, которые будут отслеживать минимальный элемент, и мы должны продолжать модифицировать эти 2 очереди, поскольку мы выполняем операции push и pop для очереди, чтобы минимальный элемент был получен за время O (1).
Вот самоописательный код sudo, основанный на упомянутом выше подходе.
Queue q, minq1, minq2;
isMinq1Current=true;
void push(int a)
{
q.push(a);
if(isMinq1Current)
{
if(minq1.empty) minq1.push(a);
else
{
while(!minq1.empty && minq1.top < =a) minq2.push(minq1.pop());
minq2.push(a);
while(!minq1.empty) minq1.pop();
isMinq1Current=false;
}
}
else
{
//mirror if(isMinq1Current) branch.
}
}
int pop()
{
int a = q.pop();
if(isMinq1Current)
{
if(a==minq1.top) minq1.pop();
}
else
{
//mirror if(isMinq1Current) branch.
}
return a;
}