LeetCode-設計最小棧
阿新 • • 發佈:2019-01-26
設計一個支援 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.
思路:
在這個物件中,包含兩個陣列,一個是棧stack本身(JavaScript中棧就是陣列),一個是從大到小倒序排列的陣列min。
對於push操作,對stack進行入棧操作,並將此元素插入到min陣列中的合適位置(保持倒序排列)。
對於pop操作,對stack進行出棧操作,並將此元素從min陣列中移除。
對於top操作,返回stack的棧頂元素,即陣列的末尾元素。
對於getMin操作,返回min陣列的末尾元素。
/** * initialize your data structure here. */ var MinStack = function() { this.stack = []; this.min = []; // 從大到小排序 }; /** * @param {number} x * @return {void} */ MinStack.prototype.push = function(x) { this.stack.push(x); let len = this.min.length; if (!len) this.min.push(x); else { for (let i = 0; i < len; i++ ) { if (x > this.min[i]) { this.min = this.min.slice(0,i).concat(x).concat(this.min.slice(i)) break } else { if (i === len-1) { this.min.push(x) } } } } }; /** * @return {void} */ MinStack.prototype.pop = function() { let popEL = this.stack.pop() let index = this.min.indexOf(popEL) this.min = this.min.slice(0, index).concat(this.min.slice(index+1)) }; /** * @return {number} */ MinStack.prototype.top = function() { let len = this.stack.length if (!len) return null return this.stack[len - 1] }; /** * @return {number} */ MinStack.prototype.getMin = function() { let len = this.min.length if (!len) return null return this.min[len - 1] }; /** * Your MinStack object will be instantiated and called as such: * var obj = Object.create(MinStack).createNew() * obj.push(x) * obj.pop() * var param_3 = obj.top() * var param_4 = obj.getMin() */