题目描述:设计一个支持 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.
思路:初始化一个最小值变量,它的初始值可以设一个非常大的数(比如 Infinity),然后开始遍历整个栈。在遍历的过程中,如果遇到了更小的值,就把最小值变量更新为这个更小的值。这样遍历结束后,我们就能拿到栈中的最小值了。
这个过程中,我们对栈进行了一次遍历,时间复杂度无疑是 O(n)。
/*** 初始化你的栈结构*/const MinStack = function() {this.stack = []};/*** @param {number} x* @return {void}*/// 栈的入栈操作,其实就是数组的 push 方法MinStack.prototype.push = function(x) {this.stack.push(x)};/*** @return {void}*/// 栈的入栈操作,其实就是数组的 pop 方法MinStack.prototype.pop = function() {this.stack.pop()};/*** @return {number}*/// 取栈顶元素,咱们教过的哈,这里我本能地给它一个边界条件判断(其实不给也能通过,但是多做不错哈)MinStack.prototype.top = function() {if(!this.stack || !this.stack.length) {return}return this.stack[this.stack.length - 1]};/*** @return {number}*/// 按照一次遍历的思路取最小值MinStack.prototype.getMin = function() {let minValue = Infinityconst { stack } = thisfor(let i=0; i<stack.length;i++) {if(stack[i] < minValue) {minValue = stack[i]}}return minValue};
时间效率更高的做法
增加一个栈 stack2 作为辅助栈
const MinStack = function() {this.stack = [];// 定义辅助栈this.stack2 = [];};/*** @param {number} x* @return {void}*/MinStack.prototype.push = function(x) {this.stack.push(x);// 若入栈的值小于当前最小值,则推入辅助栈栈顶if(this.stack2.length == 0 || this.stack2[this.stack2.length-1] >= x){this.stack2.push(x);}};/*** @return {void}*/MinStack.prototype.pop = function() {// 若出栈的值和当前最小值相等,那么辅助栈也要对栈顶元素进行出栈,确保最小值的有效性if(this.stack.pop() == this.stack2[this.stack2.length-1]){this.stack2.pop();}};/*** @return {number}*/MinStack.prototype.top = function() {return this.stack[this.stack.length-1];};/*** @return {number}*/MinStack.prototype.getMin = function() {// 辅助栈的栈顶,存的就是目标中的最小值return this.stack2[this.stack2.length-1];};
时间复杂度 0(1)
