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