Min Stack (10)

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

题目意思很简单,即建立一个stack,除了最基本的push pop top 三大函数之外,这个堆栈还能够返回堆栈中的最小值。整个题目完成以后,我有两种解题思路,并付诸实现了。

第一种解题思路是自定义stack 结点,在结点中定义一个指针用来储存存入这个元素之后stack中最小元素的位置。代码如下,很失望的是,leetcode显示内存超限。看来这种方法不行啊。先把代码贴出来吧。

 1 class node{
 2 public:
 3     int value;
 4     node *ptr,*next;
 5     node(int value=0){
 6         this->value=value;
 7         ptr=next=NULL;
 8     }
 9 };
10 class stack{
11 private:
12     node *min;
13     node *head;
14 public:
15     stack(){
16         head=NULL;
17         min=NULL;
18     }
19     void pop(){
20         if(!head)
21             return;
22         node *link=head;
23         head=head->next;
24         delete link;
25     }
26
27     void push(int x){
28         node *link=head;
29         node *temp=new node(x);
30         if(!head){
31             min=temp;
32         }
33         else{
34             if(x<=min->value){
35                 min=temp;
36             }
37         }
38         temp->ptr=min;
39         temp->next=head;
40         head=temp;
41     }
42     node *top(){
43         return head;
44     }
45     int m(){
46         if(!head)
47             return -1;
48         return head->ptr->value;
49     }
50
51 };

另外一种方法是用两个stack s,t,s用来储存真实的数据,t专门用来存储最小的数据。这里的最小的定义是当前size的stack中最小的数据。当执行pop指令时,如果pop出的数据等于最小数据时才将t弹出一个。当压入数据的时候,只有要压入的数据小于t栈顶的数据时才将其压入t,否则只压入s.这样的话节省了一部份空间,不用对s中每一个位置的元素都在t中存储该位置对应的最小元素。ps:不按这种做法,会显示内存超出限制。

先贴出内存超限的代码:

 1 class MinStack {
 2 public:
 3     stack<int>s;
 4     stack<int>t;
 5     void push(int x) {
 6         s.push(x);
 7         if(t.empty()){
 8             t.push(x);
 9         }
10         else{
11             int temp=t.top();
12             if(x<temp)
13                 t.push(x);
14             else
15                 t.push(temp);
16         }
17     }
18
19     void pop() {
20         t.pop();
21         s.pop();
22     }
23
24     int top() {
25         return s.top();
26     }
27
28     int getMin() {
29
30       int temp= t.top();
31       return temp;
32     }
33 };

相应的,节省空间的代码是:

 1 class MinStack {
 2 public:
 3     void push(int x) {
 4         s.push(x);
 5         if (t.empty() || t.top()>= x) t.push(x);//注意这里不能取>  否则如果有两个连续的最小值输入的话,若果弹出其中一个的话,返回的最小值可能会出错。
 6     }
 7
 8     void pop() {
 9         int top = s.top(); s.pop();
10         if (top == t.top()) t.pop();
11     }
12
13     int top() {
14         return s.top();
15     }
16
17     int getMin() {
18         return t.top();
19     }
20 private:
21     stack<int> s;
22     stack<int> t;
23 };
时间: 2024-10-10 11:16:46

Min Stack (10)的相关文章

2016.6.1——Min Stack

Min Stack 本题收获: 1.可以利用两个栈操作. 2.栈的基本操作. 题目: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top

LeetCode: Min Stack 解题报告

Min Stack My Submissions Question Solution Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top

[LeetCode] Min Stack Min Stack

Min Stack Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the

用stack实现min stack

遇到个好玩的问题,就是用一个stack实现min stack,什么意思呢,就是我实现stack,但是能以O(1)的时间复杂度和空间复杂度去找到我stack里面的最小值. 常规的方法是:用一个变量存放当前最小值,但是会出现这种情况,就是当我的stack pop掉的值刚好是最小值时候,后面就没法知道当前的最小值了. 怎么办呢?可以考虑在push阶段做个改变,就是在我每次往stack里面push数据的时候,跟当前的最小值比较,如果比当前最小值还小的话,那么将当前最小值入栈,再把最小值修改为这个值.在p

Java [Leetcode 155]Min Stack

题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the min

[LintCode] Min Stack 最小栈

Implement a stack with min() function, which will return the smallest number in the stack. It should support push, pop and min operation all in O(1) cost. Notice min operation will never be called if there is no number in the stack. Have you met this

[CareerCup] 3.2 Min Stack 最小栈

3.2 How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time. LeetCode上的原题,请参见我之前的博客Min Stack 最小栈.

LeetCode[stack]: Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. - push(x) – Push element x onto stack. - pop() – Removes the element on top of the stack. - top() – Get the top element. - getMin() – Retrieve the minim

LeetCode算法题-Min Stack(Java实现)

这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈. push(x) - 将元素x推入堆栈. pop() - 删除堆栈顶部的元素. top() - 获取顶部元素. getMin() - 检索堆栈中的最小元素. 例如: MinStack minStack = new MinStack(); minStack.push(-2); minSta