題目描述
設(shè)計一個支持 push ,pop ,top 操作,并能在常數(shù)時間內(nèi)檢索到最小元素的棧。
push(x) —— 將元素 x 推入棧中。
pop() —— 刪除棧頂?shù)脑亍?top() —— 獲取棧頂元素。
getMin() —— 檢索棧中的最小元素。
示例:
輸入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
輸出:
[null,null,null,null,-3,null,0,-2]
解釋:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
pop、top 和 getMin 操作總是在 非空棧 上調(diào)用。
鏈接:https://leetcode-cn.com/problems/min-stack
我的AC代碼
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.minStack = [Infinity];
this.arr = [];
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.arr.push(x);
this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
let num = this.arr.pop();
this.minStack.pop();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.arr[this.arr.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()
*/
題解思路
本題的解題關(guān)鍵是如何維護一個最小值:我們可以設(shè)計一個數(shù)據(jù)結(jié)構(gòu),使得每個元素 a 與其相應(yīng)的最小值 m 時刻保持一一對應(yīng)。 因此我們可以使用一個輔助棧,與元素棧同步插入與刪除,用于存儲與每個元素對應(yīng)的最小值。
- 當一個元素要入棧時,我們?nèi)‘斍拜o助棧的棧頂存儲的最小值,與當前元素比較得出最小值,將這個最小值插入輔助棧中;
- 當一個元素要出棧時,我們把輔助棧的棧頂元素也一并彈出;
- 在任意一個時刻,棧內(nèi)元素的最小值就存儲在輔助棧的棧頂元素中。