题目描述
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!
}
}