题目的意思是:在常数时间内获得栈中的最小值,意思是常数的话,代表一次就找到,一个栈不能解决用两个吧。(常数时间内O(1)),使用两个栈,一个普通栈,一个最小元素的栈。 核心是;minstack获取了最小的更小的,所以minstack里面的都是比第一个更小的,stack里面都是比minstack大的,偶尔有一些小的话,也会出现在minstack里面,出的时候栈顶先出的话,出完了就就行了。 问题? 为什么要出完,。,就可以保证栈顶元素是stack的最小元素了.
/** * 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); if(this.MinStack.length==0||x<=this.MinStack[this.MinStack.length-1]) { this.MinStack.push(x); } }; /** * @return {void} */ MinStack.prototype.pop = function() { if(this.stack.pop()==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.getMin = 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.getMin() */
思路:利用一个辅助栈,用来存放或者获取stack中的最小值. 开始(push)方法: 第一次数字进来的时候,先存到两个栈中,为什么? 因为没有值怎么比较。 叼砖问题? 为什么this.MinStack.push(x);不和 this.stack.push(x);一样在外面呢? 因为这是有条件的,minstack栈进数字的条件,就是必须是第一次(1)或者必须进stack的值小于minstack里面的值就可以进去了(多次).。 问题? 进去哪里? 进去minstack中。 解释完了. MinStack.prototype.push = function(x) { this.stack.push(x); if(this.MinStack.length0||x<=this.MinStack[this.MinStack.length-1]) { this.MinStack.push(x); } }; 还有最后一个问题就是为什么[this.MinStack.length-1]),因为栈是先进后出的啊,所以说进去了就在最后一个位置也就是length-1,一切以出去的时候为原则哈. /*====================================================*/ MinStack.prototype.pop = function() { if(this.stack.pop()==this.MinStack[this.MinStack.length-1]) { this.MinStack.pop(); } }; 因为进去已经完成了,然后到出去了,如果相等就出去,这里面有什么神秘的地方呢? 记住,pop函数是选择最上面的哪一个出的啊,与什么? 与minstack的最上面哪一个,进行比较是否相等,如果相等就一起出去。 为什么stack也出去了,因为在比较的时候已经出去了呀。 秘密点:如果双方都出去了,代表什么? 代表为举个例子吧。 比如: stack:123456789 minstack:1这里是不是没有一个比minstack小啊。 那: stack:121 minstack:11 记住,是stack栈顶的1与minstack栈顶的1 pop()啊 是不是只要minstack栈顶与stack的栈顶也出去了。是不是代表:minstack中的栈顶元素始终是stack的最小值啊
MinStack.prototype.top = function() { return this.stack[this.stack.length-1]; };
/**
- @return {number} */ MinStack.prototype.getMin = function() { return this.MinStack[this.MinStack.length-1]; }; 然后是返回双方的栈顶.