题目地址:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
题目示例
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
解题思路
思路1:使用辅助栈arr_stack和min_stack分别用来存储数据和栈中最小值。具体步骤如下
- Step1:每次push元素x时,直接将元素push到栈arr_stack中,然后判断栈min_stack是否为空,若为空,则将元素x压入栈min_stack中,否则,比较栈min_stack顶元素和压入元素的大小,如果压入元素x更小,则也需要将x压入栈min_stack。
- Step2:返回栈顶元素时,需要判断栈min_stack和栈arr_stack的栈顶元素是否相同,若相同,则均弹出,否则,只弹出栈arr_stack的栈顶元素即可,栈min_stack不需要改变。
- Step3:返回栈顶元素时,直接返回栈arr_stack的栈顶元素
- Step4:返回最小元素时,我们直接返回栈min_stack的栈顶元素
思路2:数组方法,使用两个数组解决,思路类似于双栈
知乎大佬关于栈的一些题目:https://zhuanlan.zhihu.com/p/101265667
程序源码
辅助栈方法
class MinStack { public: /** initialize your data structure here. */ stack<int> arr_stack; stack<int> min_arr; MinStack() { } void push(int x) { arr_stack.push(x); if(min_arr.empty() || x <= min_arr.top()) { min_arr.push(x); } } void pop() { if(arr_stack.top() == min_arr.top()) { min_arr.pop(); //弹出最小值 } arr_stack.pop(); } int top() { return arr_stack.top(); } int min() { return min_arr.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->min(); */
数组方法
class MinStack { public: /** initialize your data structure here. */ vector<int> arr; vector<int> min_arr; int min_cnt = 0; MinStack() { } void push(int x) { min_cnt = min_arr.size() ? std::min(x, min_arr[min_arr.size() - 1]) : x; min_arr.push_back(min_cnt); arr.push_back(x); } void pop() { min_arr.pop_back(); arr.pop_back(); } int top() { return arr[arr.size() - 1]; } int min() { return min_arr[min_arr.size() - 1]; } };