题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // 返回 -3
minStack.pop();
minStack.top(); // 返回 0
minStack.getMin(); // 返回 -2
解题思路
这道题需要我们设计一个支持 push、pop、top 和 getMin 操作的栈。其中 push、pop、top 操作比较简单,而 getMin 操作需要我们在常数时间内获取栈中的最小元素。
为了实现这个需求,我们可以使用两个栈来实现:
- 一个普通栈用于存储元素
- 另一个栈用于存储当前栈中的最小值。
具体来说:
- 压入元素时,如果该元素比当前最小值要小,则将其同时压入最小值栈中。
- 弹出栈顶元素时,如果该元素等于最小值栈中的栈顶元素,则将其同时弹出最小值栈中。这样,在获取最小值的时候,只需要返回最小值栈中的栈顶元素即可。
下面是该算法的 JavaScript 实现:
class MinStack {
private stack: number[];
private minStack: number[];
constructor() {
this.stack = [];
this.minStack = [Infinity];
}
push(x: number): void {
this.stack.push(x);
this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
}
pop(): void {
this.stack.pop();
this.minStack.pop();
}
top(): number {
return this.stack[this.stack.length - 1];
}
getMin(): number {
return this.minStack[this.minStack.length - 1];
}
}
算法分析
- 时间复杂度:,对于所有操作,我们都只对两个栈进行了常数次操作,因此时间复杂度为 O(1)。
- 空间复杂度:,空间复杂度取决于栈中元素的数量,因此空间复杂度为 O(N)。
总结
本文介绍了Leetcode第155题的解法,通过使用两个栈实现了支持 push、pop、top 和 getMin 操作的栈。该算法时间复杂度为O(1),空间复杂度为O(N)。