LeetCode-155. 最小棧

題目描述

設(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)的最小值。

  1. 當一個元素要入棧時,我們?nèi)‘斍拜o助棧的棧頂存儲的最小值,與當前元素比較得出最小值,將這個最小值插入輔助棧中;
  2. 當一個元素要出棧時,我們把輔助棧的棧頂元素也一并彈出;
  3. 在任意一個時刻,棧內(nèi)元素的最小值就存儲在輔助棧的棧頂元素中。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容