理解题意
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
可以清楚看到,minStack功能和普通栈基本一致,只不过多了一个O(1)求最小值的Min()函数;
所以容易想到在栈定义时加一个min变量来记录最小值(很像顺序遍历数组求最小值的感觉),但这样会造成一个问题:
也可以从下标0开始,也就是第0层的min为-2。
算法实现
代码详情:
关键代码:
func (this *MinStack) Push(x int) {
if this.stack.Len() == 0 { // 栈中为空,min自然也为空,第一个元素的min就是第一个元素自己;
this.min[0] = x // 0指的是栈的第一层(下标从0开始;)
} else { // 栈不空,就与上一层的min比较;
if x < this.min[this.stack.Len()-1] { // 当前还未入栈元素 < min
this.min[this.stack.Len()] = x // 说明入栈后min该换人了
} else {
this.min[this.stack.Len()] = this.min[this.stack.Len()-1] // 否则 刚才的min还是现在的min
}
}
this.stack.PushBack(x)
}
问题反思
// 问题反思:
// 数组的声明及分配内存空间,如何动态分配,append?
// Push函数的优化;
// 还未发起PR;