定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
示例: 代码(前面都是实现栈的接口,实际代码很短):
MinStack* minStackCreate() {
MinStack* obj = (MinStack*)malloc(sizeof(stack)*2);
StackInit(&obj->s);
StackInit(&obj->min);
return obj;
}
void minStackPush(MinStack* obj, int x) {
if(stackEmpty(&obj->s))
{
stackPush(&obj->s,x);
stackPush(&obj->min,x);
}
else
{
if(x<=stackTop(&obj->min))
{
stackPush(&obj->s,x);
stackPush(&obj->min,x);
}
else
{
stackPush(&obj->s,x);
stackPush(&obj->min,stackTop(&obj->min));
}
}
}
void minStackPop(MinStack* obj) {
stackPop(&obj->s);
stackPop(&obj->min);
}
int minStackTop(MinStack* obj) {
return stackTop(&obj->s);
}
int minStackMin(MinStack* obj) {
return stackTop(&obj->min);
}
void minStackFree(MinStack* obj) {
stackDestroy(&obj->s);
stackDestroy(&obj->min);
free(obj);
obj = NULL;
}
思路:用两个栈实现,其中一个栈正常插入数据,另外一个栈专门储存插入中的最小那个值。
插入思路:
下面是代码角度的思路: 逻辑上讲:每次插入一个新元素,都要与前面一个插入的元素相比较的原因是要保证找出最小的那个元素。
- 如果新元素是最小的,就同时插入最小栈和普通栈。
- 如果不是最小的,插入普通栈,然后在min栈里面插入一个之前最小的元素。(原因:删除的时候有可能把最小的元素删除掉,你要有足够的元素去更新换代,如果不插入可能会导致最小栈变成空了。)
删除思路: 返回最小值思路:
|