[LeetCode] 155. Min Stack
Posted aaronliu1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 155. Min Stack相关的知识,希望对你有一定的参考价值。
最小栈。题意是设计一个栈,包括如下几个函数。
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
例子,
Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
这个题我给出两种解法,一种用了两个stack,一种只需要用一个stack。两种做法的复杂度都是
时间O(1)
空间O(n)
1. 两个stack。创建两个stack,一个叫stack,另一个叫做minstack。
push() - 每当需要push的时候,元素会被正常push到stack,同时需要看一下当前元素与min的关系,以决定是否需要把这个元素push到minStack。minStack只push当前遍历到的最小值。
pop() - stack会正常pop出当前元素;因为minStack的顶端存的永远是当前的最小值,所以当stack弹出一个元素的时候,需要去minStack看一下这个元素是不是最小值,如是,也需要从minStack弹出,这样minStack顶端保留的永远是最小值。
top() - 同peek,只是看一下stack顶端的元素
getMin() - 去peek minStack顶端的元素,因为minStack的顶端永远是当前遍历到的最小值
1 /** 2 * initialize your data structure here. 3 */ 4 var MinStack = function () { 5 this.stack = []; 6 this.minStack = []; 7 }; 8 9 /** 10 * @param {number} x 11 * @return {void} 12 */ 13 MinStack.prototype.push = function (x) { 14 this.stack.push(x); 15 if (this.minStack.length) { 16 let top = this.minStack[this.minStack.length - 1]; 17 if (x <= top) { 18 this.minStack.push(x); 19 } 20 } else { 21 this.minStack.push(x); 22 } 23 }; 24 25 /** 26 * @return {void} 27 */ 28 MinStack.prototype.pop = function () { 29 let pop = this.stack.pop(); 30 let top = this.minStack[this.minStack.length - 1]; 31 if (pop === top) { 32 this.minStack.pop(); 33 } 34 }; 35 36 /** 37 * @return {number} 38 */ 39 MinStack.prototype.top = function () { 40 return this.stack[this.stack.length - 1]; 41 }; 42 43 /** 44 * @return {number} 45 */ 46 MinStack.prototype.getMin = function () { 47 return this.minStack[this.minStack.length - 1]; 48 }; 49 50 /** 51 * Your MinStack object will be instantiated and called as such: 52 * var obj = new MinStack() 53 * obj.push(x) 54 * obj.pop() 55 * var param_3 = obj.top() 56 * var param_4 = obj.getMin() 57 */
2. 一个stack,同时创建一个变量记录最小值min。
push() - push的时候看一下当前元素是否比min小,若是则把上一个min放进stack,同时更新当前最小值min。
pop() - 如果弹出值 == 当前最小值,那么再弹一次的值为上一个最小值也即出栈后更新的最小值
top() - 同peek,只是看一下stack顶端的元素
getMin() - 输出min即可
1 /** 2 * initialize your data structure here. 3 */ 4 var MinStack = function () { 5 this.stack = []; 6 this.min = Number.MAX_SAFE_INTEGER; 7 }; 8 9 /** 10 * @param {number} x 11 * @return {void} 12 */ 13 MinStack.prototype.push = function (x) { 14 // 当前值比min值更小 15 if (this.min >= x) { 16 // 将上一个min最小值保存入栈 17 this.stack.push(this.min); 18 // 更新当前最小值 19 this.min = x; 20 } 21 this.stack.push(x) 22 }; 23 24 /** 25 * @return {void} 26 */ 27 MinStack.prototype.pop = function () { 28 // 如果弹出值 == 当前最小值,那么再弹一次的值为上一个最小值也即出栈后更新的最小值 29 if (this.stack.pop() == this.min) { 30 this.min = this.stack.pop(); 31 } 32 }; 33 34 /** 35 * @return {number} 36 */ 37 MinStack.prototype.top = function () { 38 return this.stack[this.stack.length - 1]; 39 }; 40 41 /** 42 * @return {number} 43 */ 44 MinStack.prototype.getMin = function () { 45 return this.min; 46 }; 47 48 /** 49 * Your MinStack object will be instantiated and called as such: 50 * var obj = new MinStack() 51 * obj.push(x) 52 * obj.pop() 53 * var param_3 = obj.top() 54 * var param_4 = obj.getMin() 55 */
以上是关于[LeetCode] 155. Min Stack的主要内容,如果未能解决你的问题,请参考以下文章