题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次
思路
如果仅仅是一个栈来得到最小元素的话必须就需要遍历这个栈,那么时间复杂度就会是O(n),因此我们需要一个辅助栈来存储数据栈中的最小元素
一个数据栈用于实现基本的栈的入栈,出栈等基本操作,一个辅助栈用于存储数据栈的最小元素
使用辅助栈来存储最小值,每次 push()
时,如果新元素比当前最小值小,则将新元素入辅助栈;每次 pop()
时,如果弹出的元素是当前最小值,则将辅助栈栈顶元素弹出。top()
方法直接返回栈顶元素,min()
方法返回辅助栈的栈顶元素即可。
代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 var MinStack = function ( ) { this .Stack = [] this .MinStack = [Infinity ] }; MinStack .prototype .push = function (x ) { this .Stack .push (x) if (this .MinStack .length == 0 || x <= this .MinStack [this .MinStack .length -1 ]){ this .MinStack .push (x) } }; MinStack .prototype .pop = function ( ) { var number = this .Stack .pop () if (number == this .MinStack [this .MinStack .length -1 ]){ this .MinStack .pop () } }; MinStack .prototype .top = function ( ) { return this .Stack [this .Stack .length -1 ] }; MinStack .prototype .min = function ( ) { return this .MinStack [this .MinStack .length -1 ] };