每日一题
包含min函数的栈
思路(双栈法)
- 题目要求各个操作的时间复杂度为O(1),由栈的基本操作可知,入栈push,出栈pop,获取栈顶元素top都可以一步完成,时间复杂度为O(1),但获取栈中的最小元素min显然不是一步就能做到的,我们最先想到的肯定是遍历整个栈,找到最小元素,但这样时间复杂度就为O(n)了。
- 因此,我们就需要创建一个辅助栈来存取最小值元素,来达到题目要求
具体步骤
- 首先创建一个辅助栈stMin(辅助栈的栈顶元素用来存储原始栈的最小元素),和它的栈顶指针topMin,并初始化topMin为0
- 每次对原始栈进行入栈push操作时,都将入栈元素value和stMin栈顶元素(原始栈的最小元素)进行比较,如果value大于等于stMin都栈顶元素时,则对stMin的栈顶元素重复入栈1;否则就将value入栈,更新最小值。
- 进行出栈操作pop时,需要同时对原始栈和辅助栈进行pop操作
实现代码
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param value int整型
* @return 无
*/
//原始栈
static int stIn[300];
static int topIn = 0;
//辅助栈
static int stMin[300];
static int topMin = 0;
void push(int value ) {
if(value < stMin[topMin - 1] || topMin == 0) //如果辅助栈为空或入栈元素小于最小值
stMin[topMin++] = value; //更新最小值
else
{
stMin[topMin] = stMin[topMin-1]; //重复入栈
topMin++;
}
stIn[topIn++] = value;
}
void pop() {
topIn--;
topMin--;
}
int top() {
return stIn[topIn-1];
}
int min() {
return stMin[topMin-1];
}
由于栈的元素遵循先进后出原则,如果入栈push的元素value都比stMin的栈顶元素大,却不对stMin的栈顶元素进行重复入栈操作,那么对原始栈和辅助栈同时进行pop操作时,就可能会导致原始栈中的最小元素不等于辅助栈栈顶元素的情况。(读者可自行画图理解) ↩︎