链接:https://leetcode-cn.com/problems/min-stack/
链接为leetcode中文社区,题目没有区别,感觉很好用
题面描述: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
c语言中用数组来实现栈很容易做到,只需要多一个变量来记录栈内有多少元素,即记录栈顶的位置即可
想要get到栈中最小的元素,则需要在对栈进行操作的同时维护一个最小值数组即可,即记录此时栈内最小的值
当有一个元素需要入栈时,需要比较这个元素与此时最小值数组的栈顶元素的大小
当有一个元素需要出栈时,需要判断这个数是否为此时栈内的最小值
这种以空间换时间的方法在处理堆栈数组问题时很常见
typedef struct{//数组表示栈,需要多定义一个变量来记录栈的长度
int sum;
int data[10000];
} xStack;
typedef struct {//同时维和一个正常栈和一个最小值栈
xStack stackall;
xStack stackmin;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {//初始化
MinStack *s=malloc(sizeof(MinStack));
s->stackall.sum=-1;
s->stackmin.sum=-1;
return s;
}
void minStackPush(MinStack* obj, int x) {//入栈时需要考虑是否需要更新最小值
if(obj->stackall.sum==9999) return;
obj->stackall.data[++obj->stackall.sum]=x;
if(obj->stackmin.sum==-1||x<=obj->stackmin.data[obj->stackmin.sum])
obj->stackmin.data[++obj->stackmin.sum]=x;
}
void minStackPop(MinStack* obj) {//出栈时需要考虑此元素是否为栈内最小值
if(obj->stackall.sum==-1)
return;
if(obj->stackall.data[obj->stackall.sum]==obj->stackmin.data[obj->stackmin.sum])
obj->stackmin.sum--;
obj->stackall.sum--;
}
int minStackTop(MinStack* obj) {//取栈顶元素
return obj->stackall.data[obj->stackall.sum];
}
int minStackGetMin(MinStack* obj) {//去最小值栈顶元素
return obj->stackmin.data[obj->stackmin.sum];
}
void minStackFree(MinStack* obj) {//释放数组
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 = minStackGetMin(obj);
* minStackFree(obj);
*/
执行结果:
可以分析到,由于题目中的所有操作,均为单步操作,所以时间复杂度为O(1)
疫情在家学业不重,又觉得自己算法很薄弱,所以希望可以每天刷一道算法题。
在翻leetcode找题的时候看到了推出的每日1题打卡计划,觉得不错,在此写下来加深记忆,也希望可以帮到其他人 。
今天只写了c语言实现,最近在学习python和go,在复习java,过几天尝试不同语言实现。
leetcode155是一道经典的数组实现栈功能的题目
如果不出意外,每天这个时间更,欢迎监督,大家共勉。