包含main函數(shù)的棧

題目描述:

定義棧的數(shù)據(jù)結(jié)構(gòu)雏亚,請?jiān)谠擃愋椭袑?shí)現(xiàn)一個(gè)能夠得到棧最小元素的min函數(shù)。

分析:

發(fā)現(xiàn)現(xiàn)在的題目都有點(diǎn)言簡意賅但是韻味雋永的感覺摩钙,我本來以為這就是一道很平常的題目罢低,但是仔細(xì)查了下,這是一道Google06年的面試題,那么也就是說网持,這道題目的考察點(diǎn)還是很全面很有價(jià)值的宜岛。
首先,要求函數(shù)min功舀、push以及pop的時(shí)間復(fù)雜度都是O(1)萍倡。

我們考慮在原本要求的棧之外新開一個(gè)棧,用來記錄最小值辟汰,當(dāng)原棧push數(shù)據(jù)后列敲,與最小值棧中的棧頂元素比較,如果新值比較小帖汞,則在最小值棧中push新值戴而,否則繼續(xù)push最小值棧的棧頂元素。這樣翩蘸,pop的時(shí)候所意,只要將最小值棧也pop一下就可以了。而min函數(shù)返回最小值棧的棧頂元素即可催首。

如上的常規(guī)解法扶踊,需要額外的線性空間。具體實(shí)現(xiàn)的代碼如下:

代碼:

import java.util.Stack;

public class Solution {
    private Stack<Integer> stack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();
    
    public void push(int node) {
        stack.push(node);
        minStack.push(minStack.isEmpty()?node:Math.min(minStack.peek(),node));
    }
    
    public void pop() {
        stack.pop();
        minStack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}
運(yùn)行通過

優(yōu)化:

常規(guī)解空間上的一個(gè)優(yōu)化:

一般說來,最小值不會每次都需要更新,因此最小值棧里面會有很多重復(fù)元素.因此一個(gè)簡單的優(yōu)化就是:在新值當(dāng)且僅當(dāng)<=原最小值時(shí)郎任,才pushIntoMin秧耗,注意這個(gè)==的條件是不可少的,這是為了防止在pop的時(shí)候錯(cuò)誤的pop最小值涝滴。pop時(shí), 當(dāng)待pop值==最小值時(shí)绣版,popMinStack, 其他時(shí)候不對最小值棧進(jìn)行pop胶台。

下面說一種具有常數(shù)空間復(fù)雜度的方法:

在這個(gè)方法里,只需要額外開一個(gè)用于存放當(dāng)前最小值的變量min即可.因此下面提到的push和pop操作都是對于題目中要求的棧來操作的,當(dāng)然,這也是這個(gè)算法里唯一的棧.

設(shè)push的參數(shù)為v_push,pop的返回值為v_pop.

先說下整體思路:因?yàn)闂V兴性氐闹刀疾粫∮诋?dāng)其為棧頂元素時(shí)min函數(shù)的值,所以在棧中其實(shí)只需要保存某元素比相應(yīng)最小值大出來的值就可以了.而對于最小值更新的位置,棧元素肯定為0,因此可以利用這個(gè)位置來保存更多的信息,在這里是更新后前兩個(gè)最小值的差值,而這個(gè)值肯定是非正的.

根據(jù)上面的思路,push函數(shù)按照如下策略進(jìn)行:

首先push (v_push-min),如果v_push < min,更新min為v_push.

相應(yīng)的,pop函數(shù)按照如下策略進(jìn)行(稱棧頂元素為top):

如果top >= 0, v_pop = min+top, 如果top < 0, v_pop = min,然后更新min為min-top.

顯然,對于min函數(shù)來說,只需要返回min空間的內(nèi)容即可.

與張霄學(xué)長交流后,學(xué)長也講了一個(gè)類似的方法:

push時(shí)候 如果 v_push >= min, v_push 直接入棧歼疮, 如果 v_push < min, 那么入棧的是 2 * v_push - min, 然后 min = v_push. 出棧時(shí), 如果棧頂?shù)膖op >= min 直接出诈唬,如果 top < min 則出現(xiàn)異常韩脏,將min作為pop的返回值,另外需要還原前一個(gè)最小值铸磅,方法是 min = 2 * min - top

其實(shí)這兩種方法在思路上是完全一樣的,只是學(xué)長提供的方法里,棧中所有元素都比我的方法里大v_push.不過,這種變化直接帶來的好處是,在不更新最小值的情況下,壓棧值和出棧值都不需要額外的計(jì)算,在高級語言層面上,一次加減法運(yùn)算比單純的賦值至少多了一次訪存操作和一次alu的運(yùn)算,這樣估計(jì)來我的方法耗時(shí)會是學(xué)長方法的2倍左右,雖然時(shí)間復(fù)雜度都是一樣的.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赡矢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阅仔,更是在濱河造成了極大的恐慌吹散,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件八酒,死亡現(xiàn)場離奇詭異空民,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門界轩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画饥,“玉大人,你說我怎么就攤上這事浊猾《陡剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵葫慎,是天一觀的道長衔彻。 經(jīng)常有香客問我,道長偷办,這世上最難降的妖魔是什么米奸? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爽篷,結(jié)果婚禮上悴晰,老公的妹妹穿的比我還像新娘。我一直安慰自己逐工,他們只是感情好铡溪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泪喊,像睡著了一般棕硫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袒啼,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天哈扮,我揣著相機(jī)與錄音,去河邊找鬼蚓再。 笑死滑肉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摘仅。 我是一名探鬼主播靶庙,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娃属!你這毒婦竟也來了六荒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矾端,失蹤者是張志新(化名)和其女友劉穎掏击,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秩铆,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚亭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠惩。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柒凉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篓跛,到底是詐尸還是另有隱情膝捞,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布愧沟,位于F島的核電站蔬咬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沐寺。R本人自食惡果不足惜林艘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望混坞。 院中可真熱鬧狐援,春花似錦、人聲如沸究孕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨诸。三九已至镶殷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間微酬,已是汗流浹背绘趋。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颗管,地道東北人陷遮。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像忙上,于是被迫代替她去往敵國和親拷呆。 傳聞我的和親對象是個(gè)殘疾皇子闲坎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,793評論 0 38
  • LeetCode 155. Min Stack設(shè)計(jì)一個(gè)棧疫粥,支持如下操作,這些操作的算法復(fù)雜度需要是常數(shù)級腰懂,O(1)...
    徐凱_xp閱讀 1,247評論 0 0
  • 課程介紹 先修課:概率統(tǒng)計(jì)梗逮,程序設(shè)計(jì)實(shí)習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì)绣溜,編譯原理慷彤,操作系統(tǒng),數(shù)據(jù)庫概論,人...
    ShellyWhen閱讀 2,286評論 0 3
  • 寒假以來底哗,我整日悶在房間里看武俠小說岁诉,年后尤甚,開學(xué)更是整日抱著武俠停不下來跋选,甚至連文也不曾寫涕癣。 惶惶然就這樣逛了...
    流噪閱讀 979評論 6 3
  • 文/木兮云 其實(shí)我并不是一個(gè)特別喜歡孩子的人,總感覺熊孩子太調(diào)皮前标,不好帶坠韩。后來隨著我家侄子的長大,我發(fā)現(xiàn)所有的一切...
    木兮云閱讀 393評論 2 1