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左右
好的那么这次就到这里
阅读全文
0 0
- LeetCode[stack]: Min Stack
- [leetcode][stack] Min Stack
- 【Leetcode】Min Stack
- Leetcode: Min Stack
- leetcode Min stack
- Min Stack -- LeetCode
- Leetcode: Min Stack
- 【LeetCode】Min Stack
- leetcode Min Stack
- leetcode--Min Stack
- [Leetcode]Min stack
- leetcode:Min Stack
- leetcode 之 Min Stack
- leetcode Min Stack
- LeetCode(155) Min Stack
- [LeetCode]Min Stack
- leetcode:Min Stack
- leetcode - Min Stack
- 用javascript写计算器
- 19. Python开发--常用模块
- [LeetCode]155. Min Stack
- Android5.0及以上实现隐藏标题栏及全屏
- JavaScript——Tab切换
- LeetCode Min Stack
- 使用gdb调试多进程多线程程序
- OJ系统之题目列表界面
- MySQL入门--显示指定数据表的字段结构、插入指定字段的值(记录)、查看指定表中指定字段的所有记录
- 公钥密码学、数字签名与数字证书
- 堆 续2
- ionic第三方QQ,微博,微信的登录,分享功能的实现和注意事项
- [ssh]关于ssh中查询并分页方法的记录
- 解决IllegalStateException: Can not perform this action after onSaveInstanceState