包含min函数的栈
关键词:栈;双冒号
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例 1:
1 2 3 4 5 6 7 8
| MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
|
解法
解法一:
思路:
将 min() 函数复杂度降为 O(1)O(1)O(1) ,可通过建立辅助栈实现;
数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
辅助栈 B : 栈 B中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 BBB 的栈顶元素即可。
算法流程:
push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。
- 将 x 压入栈 A (即 A.push(x) );
- 若栈 B为空 或 x 小于等于 栈 B 的栈顶元素,则将 x压入栈 B(即 B.push(x) )。
pop() 函数: 重点为保持栈 A,B 的 元素一致性 。
- 执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y;
- 若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.top() 。
min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.top() 。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class MinStack { public: stack<int> stA; stack<int> stB; MinStack() { stA = {}; stB = {}; } void push(int x) { stA.push(x); if(stB.empty() || stB.top() >= x) stB.push(x); } void pop() { if(stA.top() == stB.top()) stB.pop(); stA.pop(); } int top() { return stA.top(); } int min() { return stB.top(); } };
|
代码二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class MinStack { public: stack<long long> data, min_d; MinStack() { } void push(int x) { data.push(x); min_d.push(min_d.empty() ? x : ::min(min_d.top(), (long long)x)); } void pop() { data.pop(); min_d.pop(); } int top() { return data.top(); } int min() { return min_d.top(); } };
|
知识点
- 栈的使用
- ::的使用