题目考察的知识点
- 辅助栈
题目解答方法的文字分析
借用一个辅助栈 min_stack,用于存获取 stack 中最小值。
算法流程:
push() 方法: 每当push()新值进来时,如果 小于等于 min_stack 栈顶值,则一起 push() 到 min_stack,即更新了栈顶最小值;
pop() 方法: 判断将 pop() 出去的元素值是否是 min_stack 栈顶元素值(即最小值),如果是则将 min_stack 栈顶元素一起 pop(),这样可以保证 min_stack 栈顶元素始终是 stack 中的最小值。
getMin()方法: 返回 min_stack 栈顶即可。
min_stack 作用分析:
min_stack 等价于遍历 stack所有元素,把升序的数字都删除掉,留下一个从栈底到栈顶降序的栈。
相当于给 stack 中的降序元素做了标记,每当 pop() 这些降序元素,min_stack 会将相应的栈顶元素 pop() 出去,保证其栈顶元素始终是 stack 中的最小元素。
复杂度分析:
时间复杂度 O(1) :压栈,出栈,获取最小值的时间复杂度都为 O(1) 。
空间复杂度 O(N) :包含 N 个元素辅助栈占用线性大小的额外空间。
本题解析所用的编程语言
- cpp
完整且正确的编程代码
class Solution { public: vector<int> max_weight_cow(vector<string>& op, vector<vector<int>>& vals) { stack<int> stk, stk_max; vector<int> res; int n = (int)op.size(); for (int i = 0; i < n; i++) { auto& s = op[i]; if (s == "push") { int id=vals[i][0], w=vals[i][1]; stk.push(w); if (!stk_max.empty()) stk_max.push(max(stk_max.top(), w)); else stk_max.push(w); res.push_back(-1); } else if (s == "pop") { stk.pop(); stk_max.pop(); res.push_back(-1); } else if (s == "top") { // cout <<"stk_max.size(): "<< stk_max.size() <<endl; if(stk_max.empty())res.push_back(-1); else { res.push_back(stk.top()); } } else if (s == "getMax") { if(stk_max.empty())res.push_back(-1); else res.push_back(stk_max.top()); }else{ res.push_back(-1); } // cout << res.back()<< endl; } return res; } }; /* 2023年8月8日,min栈变形,自己,5min */
EOF