155. Min Stack

186 阅读1分钟

题目描述

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) -- Push element x onto stack.
pop() -- Removes the element on top of the stack.
top() -- Get the top element.
getMin() -- Retrieve the minimum element in the stack.

Example 1:
Input ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]]
Output [null,null,null,null,-3,null,0,-2]
Explanation
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // return -3
minStack.pop();
minStack.top(); // return 0
minStack.getMin(); // return -2

Constraints: Methods pop, top and getMin operations will always be called on non-empty stacks.

解题思路

这个题目让我们自己实现一个栈, 我们可以使用数组来实现. 但是如何使用O(1)找到最小值,需要我们来处理. 这里有好几种方法: 最小值入栈法, 链表法, 最小栈法等, 我的代码是使用最小栈来实现. 当我们push一个item时, 我们判断item是否小于最小栈的栈顶元素,如果小于,我们同时将item入栈最小栈; 当我们pop一个item时,我们判断item是否与最小栈的栈顶元素相等, 如果相等, 我们就同时将最小栈pop; 这样,最小栈的栈顶元素就一直是普通栈的最小元素

示例代码

class MinStack {

    var stack: [Int]
    var minStack: [Int]

    init() {
        stack = []
        minStack = []
    }

    func push(_ x: Int) {
        stack.append(x)
        guard let min = minStack.last ,min < x else {
            minStack.append(x)
            return
        }
    }

    func pop() {
        if let last = stack.last,
            let minLast = minStack.last {
            if last == minLast {
                stack.removeLast()
                minStack.removeLast()
            }else {
                stack.removeLast()
            }
        }
    }

    func top() -> Int {
        return stack.last!
    }

    func getMin() -> Int {
        return minStack.last!
    }
}