设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
思路:
在这个对象中,包含两个数组,一个是栈stack本身(JavaScript中栈就是数组),一个是从大到小倒序排列的数组min。
对于push操作,对stack进行入栈操作,并将此元素插入到min数组中的合适位置(保持倒序排列)。
对于pop操作,对stack进行出栈操作,并将此元素从min数组中移除。
对于top操作,返回stack的栈顶元素,即数组的末尾元素。
对于getMin操作,返回min数组的末尾元素。
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.stack = [];
this.min = []; // 从大到小排序
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.stack.push(x);
let len = this.min.length;
if (!len) this.min.push(x);
else {
for (let i = 0; i < len; i++ ) {
if (x > this.min[i]) {
this.min = this.min.slice(0,i).concat(x).concat(this.min.slice(i))
break
} else {
if (i === len-1) {
this.min.push(x)
}
}
}
}
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
let popEL = this.stack.pop()
let index = this.min.indexOf(popEL)
this.min = this.min.slice(0, index).concat(this.min.slice(index+1))
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
let len = this.stack.length
if (!len) return null
return this.stack[len - 1]
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
let len = this.min.length
if (!len) return null
return this.min[len - 1]
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = Object.create(MinStack).createNew()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.getMin()
*/