LeetCode Min Stack

来源:互联网 发布:古墓丽影崛起n卡优化 编辑:程序博客网 时间:2024/06/07 13:41

大家好这几次都是带来的设计题,这题是设计一个栈,那么同样也是c语言带来的

先看题目

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.

Example:

MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin();   --> Returns -3.minStack.pop();minStack.top();      --> Returns 0.minStack.getMin();   --> Returns -2.
先按照普通思路来
typedef struct Stack{    int data;    struct Stack *next;    int Size;}MinStack;/** initialize your data structure here. */MinStack* minStackCreate(int maxSize) {    MinStack *stack=(MinStack *)malloc(sizeof(MinStack ));    stack->Size=0;    stack->next=NULL;    stack->data=NULL;    return stack;}void minStackPush(MinStack* obj, int x) {    MinStack *node=(MinStack *)malloc(sizeof(MinStack));    node->data=x;    node->next=obj->next;    obj->next=node;    obj->Size++;}void minStackPop(MinStack* obj) {    if(obj->Size)    {        MinStack *p=obj->next;        obj->next=p->next;        obj->Size--;        free(p);    }}int Min(int a,int b){    return a<b?a:b;}int minStackTop(MinStack* obj) {    return obj->next->data;}int minStackGetMin(MinStack* obj){    if(obj->Size==0)    {        return NULL;    }    else    {        int min=obj->next->data;        MinStack *p=obj->next;        while(p!=NULL)        {            min=Min(min,p->data);            p=p->next;        }        return min;    }    return NULL;}void minStackFree(MinStack* obj) {    if(obj->Size)    {        minStackPop(obj);    }    free(obj);}/** * Your MinStack struct will be instantiated and called as such: * struct MinStack* obj = minStackCreate(maxSize); * minStackPush(obj, x); * minStackPop(obj); * int param_3 = minStackTop(obj); * int param_4 = minStackGetMin(obj); * minStackFree(obj); */
这种思路就是暴力ac可以通过316ms左右,但是我们既然看到了比我们快很多的就要思考

discuss里说了用双stack

我们可以根据我们的需要设计我们的数据结构

在stack的表头里再伸展处来一个栈先po代码大家可以和上面的比对一下

typedef struct Stack{    int data;    struct Stack *next;    struct Stack *min;    int Size;}MinStack;/** initialize your data structure here. */MinStack* minStackCreate(int maxSize) {    MinStack *stack=(MinStack *)malloc(sizeof(MinStack ));    stack->Size=0;    stack->next=NULL;    stack->data=NULL;    stack->min=NULL;    return stack;}void minStackPush(MinStack* obj, int x) {    if(obj->Size==0)    {        MinStack *MinNode=(MinStack *)malloc(sizeof(MinStack));        MinNode->data=x;        MinNode->min=obj->min;        obj->min=MinNode;    }    MinStack *node=(MinStack *)malloc(sizeof(MinStack));    node->data=x;    node->next=obj->next;    obj->next=node;    obj->Size++;    if(obj->min)    {        if(x<=obj->min->data)        {            MinStack *MinNode=(MinStack *)malloc(sizeof(MinStack));            MinNode->data=x;            MinNode->min=obj->min;            obj->min=MinNode;        }    }}void minStackPop(MinStack* obj) {    if(obj->Size)    {        MinStack *p=obj->next;        if(p->data==obj->min->data)        {            obj->min=obj->min->min;        }        obj->next=p->next;        obj->Size--;        free(p);    }}int Min(int a,int b){    return a<b?a:b;}int minStackTop(MinStack* obj) {    return obj->next->data;}int minStackGetMin(MinStack* obj){    return obj->min->data;}void minStackFree(MinStack* obj) {    if(obj->Size)    {        minStackPop(obj);    }    free(obj);}/** * Your MinStack struct will be instantiated and called as such: * struct MinStack* obj = minStackCreate(maxSize); * minStackPush(obj, x); * minStackPop(obj); * int param_3 = minStackTop(obj); * int param_4 = minStackGetMin(obj); * minStackFree(obj); */
思路就是再开出来的栈中用来存放最小值,先把第一个栈中的值设置为最小,入next栈,入min栈

接下来next正常入站入栈

接下来如果遇到小于min栈的数入min栈

出栈的时候如果恰好等于min栈头的数据,则min栈头出栈(不会遇到小于的情况,因为min栈头中存放的就是栈中最小的数)

ok这样再提交代码就会很快19ms左右

好的那么这次就到这里