#leetCode刷题纪实 Day8

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  */

结果果然超时了,看看大佬是怎么写的吧

扫描二维码关注公众号,回复: 7757131 查看本文章

膜拜大佬代码:

借用辅助栈,空间换时间!!

 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/xyy999/p/11801884.html
今日推荐