最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x):将元素 x 推入栈中。
- pop():删除栈顶的元素。
- top():获取栈顶元素。
- getMin():检索栈中的最小元素。
官方思路如下
方法一:使用辅助栈
- 定义一个[数据栈]来支持 push、pop、top 操作
- 定义一个[辅助栈]其栈顶为当前最小值,以支持常数时间复杂度的 getMin 操作
代码如下(C++):
class MinStack {
stack<int> dataStack,minStack; // 定义数据栈和最小栈
public:
/** initialize your data structure here. */
MinStack() {
minStack.push(INT_MAX);
}
void push(int x) {
dataStack.push(x); // 数据栈推入x
if(minStack.empty() || x <= minStack.top()){ // 如果最小值栈为空或者数据为最小值,推入
minStack.push(x);
}
}
void pop() {
if(!dataStack.empty()){
if(dataStack.top() == minStack.top()){ // 如果当前值为最小值,则删除最小栈栈顶元素
minStack.pop(); // 删除最小栈栈顶
}
dataStack.pop(); // 删除数据栈栈顶
}
}
int top() {
return dataStack.top();
}
int getMin() {
return minStack.top();
}
};
时间复杂度 O(1),空间复杂度 O(n)。
方法二:使用 Stack<Node> 除了保存当前值外,额外保存当前最小值。
方法三:自定义 Stack,以单链表形式自定义栈。
放在最后
如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~
更多精彩内容也可以访问我的博客Aelous-BLog