https://leetcode-cn.com/problems/min-stack/
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
小菜鸡的尝试:
不是很能懂什么叫常数时间(猜测O(1)?)于是抱着必超时的心态开始写最普通的办法。
1 class MinStack {
2 public:
3 /** initialize your data structure here. */
4 stack<int> main;
5 stack<int> b;
6 MinStack() {
7
8 }
9
10 void push(int x) {
11 main.push(x);
12 }
13
14 void pop() {
15 main.pop();
16 }
17
18 int top() {
19 return main.top();
20 }
21
22 int getMin() {
23 int result = INT_MAX;
24 while (!main.empty()) {
25 if (main.top() < result) result = main.top();
26 b.push(main.top());
27 main.pop();
28 }
29 while (!b.empty()) {
30 main.push(b.top());
31 b.pop();
32 }
33 return result;
34 }
35 };
36
37 /**
38 * Your MinStack object will be instantiated and called as such:
39 * MinStack* obj = new MinStack();
40 * obj->push(x);
41 * obj->pop();
42 * int param_3 = obj->top();
43 * int param_4 = obj->getMin();
44 */
结果果然超时了,看看大佬是怎么写的吧
膜拜大佬代码:
借用辅助栈,空间换时间!!
1 class MinStack {
2 public:
3 /** initialize your data structure here. */
4 stack<int> main;
5 stack<int> b;
6 MinStack() {
7
8 }
9
10 void push(int x) {
11 main.push(x);
12 if (b.empty() || b.top() >= x) b.push(x);
13 }
14
15 void pop() {
16 int top = main.top();
17 main.pop();
18 if (top == b.top()) {
19 b.pop();
20 }
21 }
22
23 int top() {
24 return main.top();
25 }
26
27 int getMin() {
28 return b.top();
29 }
30 };
31
32 /**
33 * Your MinStack object will be instantiated and called as such:
34 * MinStack* obj = new MinStack();
35 * obj->push(x);
36 * obj->pop();
37 * int param_3 = obj->top();
38 * int param_4 = obj->getMin();
39 */
b栈的作用就是存放最小元素
当要压入栈的元素小于等于b栈栈顶元素或者b栈为空的时候,在数据入栈main栈的时候也同时入栈b栈(为什么是大于等于而不是大于呢,请看这个例子:)

同理,在出栈操作的时候,如果出栈的元素正好是b栈的栈顶元素,同时将b的栈顶也出栈。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。