7.30 155. 最小棧
設計一個支持 push
,pop
,top
操作,并能在常數時間內檢索到最小元素的棧。
實現 MinStack
類:
MinStack()
初始化堆棧對象。void push(int val)
將元素val推入堆棧。void pop()
刪除堆棧頂部的元素。int top()
獲取堆棧頂部的元素。int getMin()
獲取堆棧中的最小元素。
我的思路:
最開始我其實想得蠻簡單的,直接維護一個min就可以了,但是我發現其實這個min是不斷變化的,因為pop的原因,min很有可能會被pop掉,所以我又想到直接動態維護一個minStack,里面是升序的序列,但是我還是想得太簡單了,我發現你也有可能pop出minStack里面的值,太傷腦筋了吧。但是我發現每次geMin和stack里面的最后一個數字總是有關系的,干脆維護一個當前數值的最小棧,stack實現pop操作,minStack也對應實現pop操作就可以啦
// 返回一個數組模擬棧
var MinStack = function() {this.stack = [];this.minStack = [];return null;
};/** * @param {number} val* @return {void}*/
MinStack.prototype.push = function(val) {let minLen = this.minStack.length;if(minLen === 0){this.minStack.push(val);}else {let min = this.minStack[this.minStack.length - 1];min > val ? this.minStack.push(val) : this.minStack.push(min);}// 把最小的放在數組當中的最后一個this.stack.push(val);return null;};/*** @return {void}*/
MinStack.prototype.pop = function() {this.stack.pop();this.minStack.pop();console.log("pop" + this.minStack);return null;};/*** @return {number}*/
MinStack.prototype.top = function() {let len = this.stack.length;return this.stack[len - 1];};/*** @return {number}*/
MinStack.prototype.getMin = function() {let len = this.minStack.length;return this.minStack[len - 1];};/** * Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(val)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.getMin()*/
// 本來想要新建一個min:最小值,但是因為有pop,很有可能會把最小的也pop掉
// 那么這個時候最小值就是動態變化的了
// minStack里面只存儲升序的數值是不行的,也是因為pop的問題
// minStack里面存儲的是每一個數的情況下的的最小值
總結:這段代碼實現了一個最小棧(MinStack),能夠在常數時間內獲取棧中的最小元素。核心思路是使用兩個棧:一個主棧stack
存儲所有元素,另一個輔助棧minStack
存儲每個狀態下的最小值。
在push
操作時,會同時向兩個棧添加元素。對于minStack
,如果它是空的或者新元素比當前最小值更小,就添加新元素;否則就添加當前最小值。這樣minStack
的棧頂始終是當前棧的最小值。
pop
操作會同時從兩個棧移除棧頂元素,保持同步。
top
方法直接返回主棧的棧頂元素。
getMin
方法返回輔助棧的棧頂元素,也就是當前棧的最小值。
這種設計確保了所有操作(push、pop、top、getMin)都能在O(1)時間內完成,空間復雜度為O(n),最壞情況下需要額外存儲n個元素。