P.S 非科班出身,对C++和算法较陌生,从入门开始,转换成Leetcode平台,借鉴了很多前人的思路,博客仅为记录用。
问题8:包含min的栈
问题描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是
O
(
1
)
O(1)
O(1)。
问题要求:时间复杂度
O
(
1
)
O(1)
O(1)
解题思路:这道题目看起来很容易,但是直接提出最小值这个其实是要费一番脑筋的:当我们将数值push进栈的时候,我们的确是可以保存一个最小值,但是当我们pop最小值出栈的时候,想要得到此刻的最小值就要费一番心力,解决这个问题可以采用:
(1)搜索pop后的最小值->否定掉,这一策略的时间复杂度是O(n);
(2)重新建立另一个栈,保留每一刻的最小值,这样的话,就有一个一一对应的关系——即每pop出一个元素,同时pop出另一个栈顶当前元素对应的最小值,总体思想为:函数映射,即栈内某位置的值对应另一栈内保存的最小值;
(3)再进一步地,如果我们不想重新建立新的栈,则可以单个栈一次保存元素+当前的最小值,但这样仅仅省去了新建栈的耗费,实际存储的元素数量没有变化;
(4)可以引进链表等,但无此必要。
代码:
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
myStack.push(Min);
if (x <= Min){
Min = x;
}
myStack.push(x);
}
void pop() {
myStack.pop();
Min = myStack.top();
myStack.pop();
}
int top() {
return myStack.top();
}
int min() {
return Min;
}
private:
stack<int> myStack;
int Min = INT_MAX;
};
/**
* 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->min();
*/
注意点:
- 新建一个栈:
stack<int> myStack;
,最大值:INT_MAX
; - 栈顶值
myStack.top();
进栈myStack.push(Min);
出栈myStack.pop();
栈先进后出。 - 注意在栈中存储min的位置,否则会出现差错;
参考资料:
- [剑指offer-30]