原题链接:最小栈
个人解法
思路:
核心的是解决如何维护当前栈中的最小值,我们其实可以利用一个栈(记为S),这个栈中的元素是单调递减的,如果压栈的值小于等于S的栈顶(既最小的元素),那么我们就该值也压入S,这样我们可以通过S的栈顶直接求当前栈的最小值,若弹栈的时候,若栈顶的值与S栈顶的值相等,那么我们需要弹出S的栈顶表示最小值已经弹出。
时间复杂度: O ( n ) ,检索最小值 O ( 1 ) O(n),检索最小值O(1) O(n),检索最小值O(1)
代码:
class MinStack {
public:
stack<int> stk;
stack<int> min_stk;
MinStack() {
}
void push(int val) {
stk.push(val);
if(!min_stk.size() || min_stk.top() >= val)
min_stk.push(val);
}
void pop() {
int t = stk.top();
if(t == min_stk.top()) min_stk.pop();
stk.pop();
}
int top() {
return stk.top();
}
int getMin() {
return min_stk.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/