LeetCode Min Stack

大家好这几次都是带来的设计题,这题是设计一个栈,那么同样也是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左右

好的那么这次就到这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值