每日一题,防止痴呆 = =
一、题目大意
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) —— 将元素 x 推入栈中。
- pop() —— 删除栈顶的元素。
- top() —— 获取栈顶元素。
- getMin() —— 检索栈中的最小元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
二、题目思路以及AC代码
这次的每日一题是要设计一个数据结构,最小栈,相比于我们通常学到的栈,这个数据结构要求在实现基本栈操作的同时,可以在常数时间复杂度内取得栈的最小值。
基本思路是这样,我们可以在往栈中push的同时,计算当前截止到栈顶的最小值,并且把这些最小值存在另一个栈中,两个栈同步更新即可。
当然核心思想是这样的,就是要同步计算当前的最小值并且保存,具体实现还是有很多方法,这里我仅仅写了两个栈同步更新的实现,比较容易理解。
下面给出AC代码:
class MinStack {
private:
stack<int> stack_;
stack<int> min_stack_;
public:
/** initialize your data structure here. */
MinStack() {
min_stack_.push(INT_MAX);
}
void push(int x) {
stack_.push(x);
min_stack_.push(min(min_stack_.top(), x));
}
void pop() {
stack_.pop();
min_stack_.pop();
}
int top() {
return stack_.top();
}
int getMin() {
return min_stack_.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();
*/
如果有问题,欢迎大家指正!!!