O(1)复杂度求一个栈的最小值
要求一个栈的最小值,第一反应肯定是一个个出栈,那样太蠢了,如何更优呢?
第一个思路就是自己定义一个指针,始终指向保存了最小值的那个节点不就行了。看似正确,但是当你最小值的那个节点出栈了,那么如何找到下一个最小值呢?
因此,我们需要一个数据结构来保存每一个状态下的最小值。即我们应当知道每当栈中插入一个新元素后的最小值位置,也应当知道每当栈中删除一个元素后的最小值的位置。
做法很简单,用另一个栈来记录每一个状态下的最小值的位置即可!
我们假设原来的那个栈叫stack
,用来记录最小值位置的栈叫minStack
,那么我们要做的就是让minStack随着stack的变化而动态变化,stack出栈时,minStack跟着出栈,stack入栈时,minStack跟着入栈。
minStack入栈的是什么呢?很显然,是拿stack新入栈的元素和minStack栈顶元素比较大小,如果minStack栈顶元素比stack新入栈元素小,那么minStack就入栈一个和原来minStack栈顶元素相同的的元素,否则入栈新入栈的这个元素的指针。
新入栈的元素如果和原来minStack栈顶元素一样大,那么入不入栈都行,因为后入栈的必定先出栈,不论如何都可以保证一直都能找到最小值。
说了这么多,想练练手的可以去:https://leetcode-cn.com/problems/min-stack/
下面放上我的代码:
class MinStack {
public:
/** initialize your data structure here. */
stack<int> sstack;
stack<int> minStack;
MinStack() {
}
void push(int x) {
sstack.push(x);
if(minStack.size() == 0)
{
minStack.push(x);
return;
}
int originTop = minStack.top();
if(x <= originTop)
{
minStack.push(x);
}else{
minStack.push(originTop);
}
}
void pop() {
sstack.pop();
minStack.pop();
}
int top() {
return sstack.top();
}
int getMin() {
return minStack.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();
*/