一、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
二、思路讲解
Java的栈中,push()和pop()的时间复杂度都为o(1),关键在于,如何实现时间复杂度为o(1)的遍历栈的方法。
这就需要用到辅助栈minStack,该栈的顶部元素即为数据栈中的最小值。当push进一个元素x之后,我们将该元素与minStack栈顶元素比较,若小于栈顶元素,即将栈顶元素进行替换为x。如果数据栈为空,即将x作为最小值。
三、Java代码实现
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stack;
Stack<Integer> minStack;
public MinStack() {
stack = new Stack<Integer>(); //数据栈
minStack = new Stack<Integer>(); //最小值栈
}
public void push(int x) {
//如果数据栈为空,即将push进来的值最为最小值。
if(stack.isEmpty()) {
stack.push(x);
minStack.push(x);
} else {
stack.push(x);
//将该元素与minStack栈顶元素比较,若小于栈顶元素,即将栈顶元素进行替换为x
if(x < minStack.peek()) {
minStack.push(x);
} else {
minStack.push(minStack.peek());
}
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
四、时间复杂度分析
o(1)
执行用时:17 ms, 在所有 Java 提交中击败了93.33%的用户
内存消耗:40.2 MB, 在所有 Java 提交中击败了57.66%的用户
五、其他代码实现
从力扣上偷的其他代码的实现,以供参考。
1、Python
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.minv = float('inf')
def push(self, x: int) -> None:
if not self.stack:
self.stack.append(0)
self.minv = x
else:
self.stack.append(x-self.minv)
self.minv = min(self.minv,x)
def pop(self) -> None:
pop = self.stack.pop()
if pop < 0:self.minv = self.minv - pop
def top(self) -> int:
top = self.stack[-1]
return self.minv + top if top >= 0 else self.minv
def min(self) -> int:
return self.minv
2、JavaScript
const MinStack = function () {
this.stack = [];
};
MinStack.prototype.push = function (x) {
this.stack.push({
val: x,
min: this.stack.length ? Math.min(x, this.min()) : x,
});
};
MinStack.prototype.pop = function () {
this.stack.pop();
};
MinStack.prototype.top = function () {
return this.stack[this.stack.length - 1].val;
};
MinStack.prototype.min = function () {
return this.stack[this.stack.length - 1].min;
};