题来自leetcode的《剑指Offer》
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
摘要:时间复杂度O(1)意思是在调用min等方法时,运行次数和数据量N成常数关系,就是不会随数据量N的变化而变化:那么我们就不能用循环,递归之类的;
一开始我打算用sort排序解决min,但还是不太符合题意:
let copyArr = [...this.stackArr];
copyArr.sort((a, b) => {
return a - b;
});
return copyArr.shift();
那既然不能对数组进行循环排序,我们何不在加入的时候就比较并存储小的元素呢?
if (this.min_stack.length) {
this.min_stack.push(Math.min(this.min_stack[this.min_stack.length - 1], x));
} else {
this.min_stack.push(x);
}
完整代码:
var MinStack = function () {
this.x_stack = [];
this.min_stack = [];
};
MinStack.prototype.push = function (x) {
this.x_stack.push(x);
// 每次都加入最小值
if (this.min_stack.length) {
this.min_stack.push(Math.min(this.min_stack[this.min_stack.length - 1], x));
} else {
this.min_stack.push(x);
}
};
MinStack.prototype.pop = function () {
this.x_stack.pop();
this.min_stack.pop();
};
MinStack.prototype.top = function () {
return this.x_stack[this.x_stack.length - 1];
};
MinStack.prototype.min = function () {
return this.min_stack[this.min_stack.length - 1];
};
let minStack = new MinStack();
minStack.push(-3);
minStack.push(0);
minStack.push(-2);
console.log(minStack.min());
minStack.pop();
console.log(minStack.min());