题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); —> 返回 -3.
minStack.pop();
minStack.top(); —> 返回 0.
minStack.min(); —> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这个有缺陷,min的复杂度不是 O(1), 而是 O(N)。参考了一下别人的做法,用双栈。
栈A用于普通用处。
栈B用于维护严格大小顺序栈,然后min返回栈顶即可。
/*** initialize your data structure here.*/var MinStack = function() {this.stack = [];};/*** @param {number} x* @return {void}*/MinStack.prototype.push = function(x) {this.stack.push(x);};/*** @return {void}*/MinStack.prototype.pop = function() {this.stack.pop();};/*** @return {number}*/MinStack.prototype.top = function() {return this.stack[this.stack.length - 1];};/*** @return {number}*/MinStack.prototype.min = function() {let min = this.stack[0];for (let i = 1; i < this.stack.length; i++) {if (min > this.stack[i]) min = this.stack[i];}return min;};/*** Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(x)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.min()*/
解2:正确
/*** initialize your data structure here.*/var MinStack = function() {this.stack = [];this.minStack = [];};/*** @param {number} x* @return {void}*/MinStack.prototype.push = function(x) {this.stack.push(x);let minStackLen = this.minStack.length;// 这里判定一下。如果这个栈为空或 加入的x小于等于最小栈的栈顶元素,那么就把它加入到最小栈中if (minStackLen <= 0 || this.minStack[minStackLen - 1] >= x) {this.minStack.push(x);}};/*** @return {void}*/MinStack.prototype.pop = function() {let x = this.stack.pop();// 弹出时判定一下,如果弹出的是最小栈中的元素,那么最小栈也要相应出栈if (x == this.minStack[this.minStack.length - 1]) {this.minStack.pop();}};/*** @return {number}*/MinStack.prototype.top = function() {return this.stack[this.stack.length - 1];};/*** @return {number}*/MinStack.prototype.min = function() {// 这里就可以直接返回最小栈的栈顶return this.minStack[this.minStack.length - 1];};/*** Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(x)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.min()*/
