剑指 Offer 30. 包含min函数的栈

141 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

剑指 Offer 30. 包含min函数的栈

一、题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.min(); --> 返回 -3.

minStack.pop();

minStack.top(); --> 返回 0.

minStack.min(); --> 返回 -2.

提示:

各函数的调用总次数不超过 20000 次

注意:本题与主站 155 题相同:leetcode-cn.com/problems/mi…

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这部分可以写写:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题就是要求写一个栈来实现各种操作。不过同普通栈不同的是多了一个获取最小值的方法。

    我们的做法是用一个变量min记录栈中的最小值,怎么记录呢?每次有元素进栈就记录一次。

    至于出栈更新最小值,我们可以搞一个辅助栈,栈顶代表当前栈的最小值,每当有元素入栈,就把最小值放入辅助栈,出栈时,辅助栈也出栈,这样最小值就能及时更新。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的,知道建栈即可。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    动态栈!

三、AC 代码:

 typedef struct node_t{
     struct node_t *prev;
     struct node_t *minprev;
     int data;
 }Node;
 typedef struct list_t{
     Node *top;
     Node *bottom;
     int size;
 }List;
 typedef struct {
     List* minList;
     List* stackList;
     int size;
 } MinStack;
 ​
 /** initialize your data structure here. */
 ​
 MinStack* minStackCreate() {
     MinStack* obj = malloc(sizeof(MinStack));
     if(obj==NULL)
     {
         return NULL;
     }
     memset(obj,0,sizeof(MinStack));
     List *minList = malloc(sizeof(List));
     List *stackList = malloc(sizeof(List));
     memset(minList,0,sizeof(List));
     memset(stackList,0,sizeof(List));
     if(minList == NULL || stackList==NULL)
     {
         return NULL;
     }
     obj->minList = minList;
     obj->stackList = stackList;
     return obj;
 }
 ​
 void minStackPush(MinStack* obj, int x) {
     Node *node = NULL;
     if(obj==NULL)
     {
         return;
     }
     node = malloc(sizeof(Node));
     memset(node,0,sizeof(Node));
     node->data = x;
     if(obj->stackList->top==NULL)
     {
         obj->stackList->top = obj->stackList->bottom = node;
 ​
     }
     else
     {
         node->prev = obj->stackList->top;
         obj->stackList->top = node;
 ​
     }
     if(obj->minList->top==NULL)
     {
         obj->minList->top = obj->stackList->bottom = node;
 ​
         return;
     }
     if(obj->minList->top->data >= x)
     {
         node->minprev = obj->minList->top;
         obj->minList->top = node;
 ​
     }
     return;
 }
 ​
 void minStackPop(MinStack* obj) {
     Node * node = NULL;
     if(obj==NULL)
     {
         return;
     }
     if(obj->stackList->top ==NULL || obj->minList->top ==NULL)
     {
         return;
     }
     if(obj->stackList->top->data == obj->minList->top->data)
     {
         node = obj->minList->top;
         obj->minList->top = node->minprev;
     }
     node = obj->stackList->top;
     obj->stackList->top = node->prev;
     free(node);
     return;
 }
 ​
 int minStackTop(MinStack* obj) {
     if(obj->stackList->top)
     {
         return obj->stackList->top->data;
     }
     return 0;
 }
 ​
 int minStackMin(MinStack* obj) {
     if(obj->minList->top)
     {
         return obj->minList->top->data;
     }
     return 0;
 }
 ​
 void minStackFree(MinStack* obj) {
     if(obj==NULL)
     {
         return;
     }
     Node *node = NULL;
     while(node)
     {
         minStackPop(obj);
         node = obj->stackList->top;
     }
     free(obj->minList);
     free(obj->stackList);
     free(obj);
 }
 ​
 /**
  * Your MinStack struct will be instantiated and called as such:
  * MinStack* obj = minStackCreate();
  * minStackPush(obj, x);
  
  * minStackPop(obj);
  
  * int param_3 = minStackTop(obj);
  
  * int param_4 = minStackMin(obj);
  
  * minStackFree(obj);
 */
 ​

四、总结:

如果你还有更多的思考、分析、总结,通通都加上来吧~

剑指 Offer 30. 包含min函数的栈

同样的解题思路可以解决下面这道题目 题目:716. 最大栈