圖解LeetCode——劍指 Offer 30. 包含min函數(shù)的棧

一、題目

定義棧的數(shù)據(jù)結(jié)構(gòu)铲球,請在該類型中實現(xiàn)一個能夠得到棧的最小元素的 min 函數(shù)在該棧中,調(diào)用 min椭赋、pushpop 的時間復雜度都是 O(1) 谈秫。

二扒寄、示例

2.1> 示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.

提示:

  • 各函數(shù)的調(diào)用總次數(shù)不超過 20000

三、解題思路

3.1> 維護不完整的有序棧

根據(jù)題目描述拟烫,我們需要定義一個棧結(jié)構(gòu)stack该编,來支持實現(xiàn)MinStack類的push()pop()top()方法硕淑。

但是對于min()方法來說课竣,它是用來返回當前堆棧中最小元素的,那么我們可以再創(chuàng)建一個棧結(jié)構(gòu)stackOrder置媳,用來保存一個“不完整”的有序棧于樟,其存儲規(guī)則如下所示:

  • 當新元素x 小于/等于 stackOrder的棧頂元素時,元素x可以保存到stackOrder的棧頂拇囊。
  • 當新元素x 大于 stackOrder的棧頂元素時迂曲,元素x不執(zhí)行入棧操作。

那么通過如上規(guī)則寥袭,stackOrder中的元素就是從棧頂開始路捧,自上而下逐一變大的,而棧頂就是當前最小的元素传黄。

我們講完了入棧規(guī)則杰扫,那么出棧呢?針對于stackOrder來說膘掰,出棧規(guī)則如下所示:

  • 當stack的棧頂元素 等于 stackOrder的棧頂元素時章姓,stack和stackOrder的棧頂元素都出棧。
  • 當stack的棧頂元素 不等于 stackOrder的棧頂元素 時,只有stack的棧頂元素出棧啤覆。

好了苍日,基本解題思路描述完畢了,下面我們舉例窗声,分別入棧-2相恃、0-3,然后再執(zhí)行3次出棧操作笨觅,再來看一下stackstackOrder是如何處理的拦耐。具體邏輯如下所示:

3.2> 利用元素記錄“入棧那一刻”的最小值

那么除了上面的解題思路外,我們其實也可以創(chuàng)建一個Node節(jié)點见剩,里面具有如下3個屬性:

  • int value】當前元素的值杀糯;
  • int min】當前所有入棧元素中,最小的值苍苞;
  • Node pre】前一個入棧元素節(jié)點固翰;

那么,針對MinStack類的push()羹呵、pop()top()方法骂际,我們就可以通過構(gòu)建一個Node鏈表來實現(xiàn)底層邏輯。而針對min()方法來說冈欢,因為每個Node節(jié)點都保存了它入棧之前所有入棧元素中歉铝,最小的值min,所以直接返回當前節(jié)點的min值就可以了凑耻。此處就不畫圖了太示,具體邏輯可以看下面4.2的源碼實現(xiàn)部分。

四香浩、代碼實現(xiàn)

4.1> 維護不完整的有序棧

class MinStack {
    private Deque<Integer> stack, stackOrder;
    public MinStack() {
        stack = new ArrayDeque<>();
        stackOrder = new ArrayDeque<>();
    }
    public void push(int x) {
        stack.addLast(x);
        if (stackOrder.isEmpty() || min() >= x) stackOrder.addLast(x);
    }
    public void pop() {
        int x = stack.removeLast();
        if (min() == x) stackOrder.removeLast();
    }
    public int top() {return stack.getLast();}
    public int min() {return stackOrder.getLast();}
}

4.2> 利用元素記錄“入棧那一刻”的最小值

class MinStack {
    public Node top;
    public MinStack() {}
    public void push(int x) {
        top = new Node(x, top == null ? x : Math.min(x, top.min), top);
    }
    public void pop() {top = top.pre;}
    public int top() {return top.value;}
    public int min() {return top.min;}
}
class Node {
    public int value, min;
    public Node pre;
    public Node(int value, int min, Node pre) {
        this.value = value;
        this.min = min;
        this.pre = pre;
    }
}

今天的文章內(nèi)容就這些了:

寫作不易类缤,筆者幾個小時甚至數(shù)天完成的一篇文章,只愿換來您幾秒鐘的 點贊 & 分享 弃衍。

更多技術(shù)干貨呀非,歡迎大家關(guān)注公眾號“爪哇繆斯” ~ \(o)/ ~ 「干貨分享,每天更新」

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镜盯,一起剝皮案震驚了整個濱河市岸裙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌速缆,老刑警劉巖降允,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艺糜,居然都是意外死亡剧董,警方通過查閱死者的電腦和手機幢尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翅楼,“玉大人尉剩,你說我怎么就攤上這事∫汶” “怎么了理茎?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長管嬉。 經(jīng)常有香客問我皂林,道長,這世上最難降的妖魔是什么蚯撩? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任础倍,我火速辦了婚禮,結(jié)果婚禮上胎挎,老公的妹妹穿的比我還像新娘沟启。我一直安慰自己,他們只是感情好呀癣,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布美浦。 她就那樣靜靜地躺著弦赖,像睡著了一般项栏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬竖,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天沼沈,我揣著相機與錄音,去河邊找鬼币厕。 笑死列另,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的旦装。 我是一名探鬼主播页衙,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阴绢!你這毒婦竟也來了店乐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤呻袭,失蹤者是張志新(化名)和其女友劉穎眨八,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左电,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡廉侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年页响,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片段誊。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡闰蚕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出连舍,到底是詐尸還是另有隱情陪腌,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布烟瞧,位于F島的核電站诗鸭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏参滴。R本人自食惡果不足惜强岸,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾赔。 院中可真熱鬧蝌箍,春花似錦、人聲如沸暴心。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽专普。三九已至悯衬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檀夹,已是汗流浹背筋粗。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炸渡,地道東北人娜亿。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蚌堵,于是被迫代替她去往敵國和親买决。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容