7.30 155. 最小栈
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
我的思路:
最开始我其实想得蛮简单的,直接维护一个min就可以了,但是我发现其实这个min是不断变化的,因为pop的原因,min很有可能会被pop掉,所以我又想到直接动态维护一个minStack,里面是升序的序列,但是我还是想得太简单了,我发现你也有可能pop出minStack里面的值,太伤脑筋了吧。但是我发现每次geMin和stack里面的最后一个数字总是有关系的,干脆维护一个当前数值的最小栈,stack实现pop操作,minStack也对应实现pop操作就可以啦
// 返回一个数组模拟栈
var MinStack = function() {
this.stack = [];
this.minStack = [];
return null;
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function(val) {
let minLen = this.minStack.length;
if(minLen === 0){
this.minStack.push(val);
}else {
let min = this.minStack[this.minStack.length - 1];
min > val ? this.minStack.push(val) : this.minStack.push(min);
}
// 把最小的放在数组当中的最后一个
this.stack.push(val);
return null;
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
this.stack.pop();
this.minStack.pop();
console.log("pop" + this.minStack);
return null;
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
let len = this.stack.length;
return this.stack[len - 1];
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
let len = this.minStack.length;
return this.minStack[len - 1];
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(val)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.getMin()
*/
// 本来想要新建一个min:最小值,但是因为有pop,很有可能会把最小的也pop掉
// 那么这个时候最小值就是动态变化的了
// minStack里面只存储升序的数值是不行的,也是因为pop的问题
// minStack里面存储的是每一个数的情况下的的最小值
总结:这段代码实现了一个最小栈(MinStack),能够在常数时间内获取栈中的最小元素。核心思路是使用两个栈:一个主栈stack
存储所有元素,另一个辅助栈minStack
存储每个状态下的最小值。
在push
操作时,会同时向两个栈添加元素。对于minStack
,如果它是空的或者新元素比当前最小值更小,就添加新元素;否则就添加当前最小值。这样minStack
的栈顶始终是当前栈的最小值。
pop
操作会同时从两个栈移除栈顶元素,保持同步。
top
方法直接返回主栈的栈顶元素。
getMin
方法返回辅助栈的栈顶元素,也就是当前栈的最小值。
这种设计确保了所有操作(push、pop、top、getMin)都能在O(1)时间内完成,空间复杂度为O(n),最坏情况下需要额外存储n个元素。