LeetCode - 155. 最小栈
题目
155. 最小栈 - 力扣(LeetCode)
思路
针对这道最小栈的题目,我的思路是使用两个栈来实现 - 一个正常的数据栈和一个辅助的最小值栈。
首先,我分析了题目要求:需要在O(1)时间内实现push、pop、top操作,并且能够获取栈中的最小元素。常规栈可以满足前三个操作,但获取最小元素通常需要O(n)时间。
我的解决思路是:
- 用一个数据栈存储所有元素,实现基本的栈操作
- 用一个最小栈来跟踪当前栈中的最小值
具体实现过程:
- 当push一个新元素时,将其加入数据栈;同时,如果这个元素小于或等于当前最小栈的栈顶(或最小栈为空),则也将其压入最小栈
- 当pop一个元素时,检查它是否等于最小栈的栈顶,如果是,则最小栈也需要pop
- top操作直接返回数据栈的栈顶
- getMin操作直接返回最小栈的栈顶
这个方法的关键在于最小栈的维护 - 我们不是每次都把元素放入最小栈,而是只在元素是新的最小值时才放入。这确保了最小栈的栈顶始终是当前数据栈中的最小值,同时所有操作的时间复杂度都保持在O(1)。
空间复杂度是O(n),最坏情况下,如果所有元素是递减的,最小栈会存储所有元素。但在实际应用中,通常不会这么糟糕。
正确写法
class MinStack {stack<int> dataSt;stack<int> minSt;
public:/** initialize your data structure here. */MinStack() {}void push(int x) {dataSt.push(x);if(minSt.empty() || x <= minSt.top()){minSt.push(x);}}void pop() {if(dataSt.top() == minSt.top()){minSt.pop();}dataSt.pop();}int top() {return dataSt.top();}int getMin() {return minSt.top(); }
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/