Разработайте datastructure, чтобы поддерживать операции стека и найти минимум

Вопрос об интервью: Разработайте структуру данных, которая имеет следующие функции

  • продвиньте данные
  • выталкивает последние вставленные данные [LIFO]
  • Дает минимум

Все вышеупомянутые операции должны иметь сложность O(1)

5
задан Cœur 9 December 2017 в 18:38
поделиться

2 ответа

Вы можете сделать это, поддерживая два стека

стек - выполняйте обычные операции push и pop с этим стеком.

minStack - этот стек используется для получения минимального элемента в стеке за O (1) время. В любой момент верхний элемент этого стека будет минимальным из всех элементов в стеке.

push( item a) 
    // push the element on the stack.
    stack.push(a)   

    // find the min of the ele to be pushed and the ele on top of minStack.
    if(minStack.isEmpty()) 
        min = a
    else
        min = Min(a,minStack.top())

    // push the min ele on the minStack.
    minStack.push(min) 
end push


pop()
    // pop and discard
    minStack.pop() 

    // pop and return
    return stack.pop() 
end pop


findMin()
    return minStack.top()
end findMin

В приведенном выше решении каждый раз, когда элемент помещается в стек, происходит соответствующее нажатие на minStack . Таким образом, в любой момент количество элементов в стеке и minStack одинаково. Мы можем немного оптимизировать его, поместив элемент в minStack , только если элемент меньше текущего min.

push( item a) 
    // push the element on the orginal stack.
    stack.push(a)   

    if(minStack.isEmpty())
            // if minStack is empty push.
            minStack.push(a) 
    // else push only if the element is less than or equal to the present min.
    else if(a <= minStack.top()) 
        minStack.push(a)
end push

pop()
    // pop from the stack
    ele = stack.top()     
    if(minStack.top() == ele)
            // pop only if the top element is ele.
        minStack.pop() 

    // return the popped element.
    return ele 
end pop
13
ответ дан 18 December 2019 в 10:44
поделиться

Для этого ваша структура данных должна содержать два стека. Человек должен действовать как обычно; другой содержит только последний минимальный видимый элемент. Когда вы нажимаете элемент, если он меньше / равен вершине второго стека (или стек пуст), поместите его также и во второй стек. Когда вы выталкиваете элемент, если он равен вершине второго стека, выталкивайте и второй стек.

Минимум в любой момент - это вершина второй стопки.

2
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: