擴充套件堆疊使得O 1 時間求棧的最小值(最大值)

2021-05-27 20:40:12 字數 1022 閱讀 7983

參考:

擴充套件stack的實現,完成正常的push,pop操作,新增訪問最小(或最大)元素的介面min(),使得push,pop,min的時間複雜度都是o(1)。

拿到這道題,我們最先的思考往往是,設計乙個演算法從棧中拿到最小值,所以開始考慮任何可以用來實現該功能的排序和查詢演算法。假設棧中有n個元素,一切排序和查詢都不可能實現o(1)的時間複雜度找到最小值。

再看題目,既然是擴充套件stack的實現,stack是一種資料結構,一種資料的組織方式,擴充套件它,也就允許我們對其資料組織方式和儲存內容作一些改變吧。所以我們就有了下面的思路:

把當前最小值再用個棧存起來,並且在進行push和pop操作的時維護它。維護要求如下:

如果有比當前最小值大的元素入棧,當前最小值不變

如果有比當前最小值小的元素入棧,當前最小值變為新加入元素,並壓入最小值棧(相等時也需做壓棧操作)

如果有比當前最小值大的元素出棧,當前最小值不變(注意:彈出的操作時,一定不可能彈出比當前最小值還小的元素,也就是說如果你彈出了乙個比當前最小值還小的元素,就證明你的那個當前最小值不是當前最小值)

如果有和當前最小值的元素相同出棧,當前最小值變為當前當前最小值入棧之前那個最小值,當前最小值退出。

綜上,我們發現乙個規律:對於最小值而言,如果有更小的數入棧,需要將其儲存為當前最小,如果當前最小數出棧,當前最小數變成當前最小數入棧之前那個最小數,所以,對於最小數而言也具有先進後出,後進先出的特點,只是並不是每次push和pop操作都牽涉到最小數的進出。所以我們考慮用雙棧來實現,乙個棧用來存放資料,滿足棧資料結構原始要求,乙個棧用來存放最小值,在每次push和pop操作執行時,按照上面的規則維護最小值棧。

棧在o 1 時間獲取最小元素

pop,push裡面都為o 1 這裡只有時間複雜度的要求,但是沒有空間複雜度的要求 思路1 原來的棧裡面只有乙個陣列,來存放所有的push值,現在,多乙個用來存放最小值得棧,如果新進元素的值比最小值棧裡面棧頂的元素要小,就push到最小值棧,其它情況不變。思路2 將放資料的單獨列出,放在乙個類裡面,...

O 1 時間求出棧內元素最小值

問題描述 對現在的stack 棧 資料結構進行改進,加乙個min 功能,使之能在常數,即o 1 時間內給出棧中的最小值。可對push 和pop 函式進行修改,但要求其時間複雜度都只能是o 1 解決方案 在棧的每個元素加乙個屬性值 min 用於記錄當前位置下面的元素的最小值 元素的值用key表示 壓棧...

棧在O 1 時間內求min值

實現乙個棧stack,要求實現push 出棧 pop 入棧 min 返回最小值的操作 的時間複雜度為o 1 思路 1 在stack的資料結構中加兩個個字段,如 typedef struct stack pop,push的時候都去棧頂元素,所以是o 1 min的時候取stack的min欄位,所以也是o...