返回
最小栈:LeetCode第155题的巧妙解决方案
前端
2023-11-21 20:55:50
前言:栈的概念与LeetCode第155题
栈是一种先进后出的线性数据结构,元素只能从栈顶进入或离开。与队列不同,栈遵循“后进先出”的原则。LeetCode第155题要求我们设计一个支持push、pop、top操作,并能在常数时间内检索到最小元素的栈。这道题的难点在于如何在维护栈基本功能的同时,高效地检索最小元素。
巧妙的解决方案:辅助栈的妙用
为了高效地实现最小栈的功能,我们引入一个辅助栈minStack。minStack始终存储栈中所有元素的最小值,即使这些元素已经被pop出。当我们push一个元素x时,如果x小于或等于minStack栈顶元素,则将x也push进minStack。如果x大于minStack栈顶元素,则不将x放入minStack。
当我们pop一个元素时,如果被pop出的元素是minStack栈顶元素,则同时从minStack中pop出该元素。否则,不从minStack中pop出任何元素。
算法实现:伪代码与Java代码
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (minStack.isEmpty() || x <= minStack.peek()) {
minStack.push(x);
}
}
public void pop() {
int x = stack.pop();
if (x == minStack.peek()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
算法分析:时间复杂度和空间复杂度
-
时间复杂度:
- push():O(1)
- pop():O(1)
- top():O(1)
- getMin():O(1)
-
空间复杂度:O(n),其中n是栈中元素的数量。
结语
LeetCode第155题最小栈的巧妙解决方案在于利用辅助栈minStack来维护栈中所有元素的最小值。这种方法简单易懂,时间复杂度和空间复杂度都为O(1),非常适合处理涉及最小值检索的栈问题。希望本文对您有所启发,也欢迎您在评论区留下您的想法和建议。