題目:定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式(時間複雜度應為o(1))。
思路一:利用乙個變數min,每次push時,比較push的值和min的值,若push值小於min的值則將min值進行更新。
思路一分析:該方法可以獲得當前棧的最小值,但若最小值被pop出去後,想重新獲得最小值則需要重新遍歷棧內元素,再更新最小值了。所以這個方法的時間複雜度為o(n),空間複雜度為o(1)。
思路二:申請乙個輔助棧mins,mins中儲存最小值,當push的值小於mins的棧頂元素時,將push值同時壓入mins和元資料棧。當push值大於mins的棧頂元素時,將push值壓入元資料棧,將mins棧頂元素再次壓入mins棧。
思路二分析,該方法的時間複雜度降到了o(1),但是空間複雜度為o(n)。
演算法優化:
由此可以看出輔助棧中有大量重複的值,這點可以進行優化。可以在push時判斷一下,如果比最小值還大,那麼就不加入輔助棧。pop時如果要pop的資料不等於輔助棧棧頂元素,則輔助棧的棧頂就不出棧。如下圖所示:
上述方法的問題在於如果要push乙個和最小值相同的數進棧則輔助棧和元資料棧中都要push。否則最小值出棧後下乙個最小值就不對了。如下圖所示
針對上述問題的優化思路:在mins棧中儲存最小值的索引。如下圖所示
最終**:
importj**a.util.arraylist;
import
j**a.util.list;
/***
@author
xiaoshi on 2018/9/1. */
public
class
minstack
else}}
public
int pop() throws
exception
//pop時先獲取索引
int popindex = data.size() - 1;
//獲取mins棧頂元素,它是最小值索引
int minindex = mins.get(mins.size() - 1);
//如果pop出去的索引就是最小值索引,mins才出棧
if(popindex ==minindex)
return data.remove(data.size() - 1);
}public
int getmin() throws
exception
//獲取mins棧頂元素,它是最小值索引
int minindex = mins.get(mins.size() - 1);
return
data.get(minindex);}}
劍指offer 包含min函式的棧
一 問題描述 二 思路 兩個棧,乙個當前棧data,乙個輔助棧m min,輔助棧用來儲存當前的最小值,如果出棧,輔助棧也出棧,棧頂元素始終是當前的最小值。在入棧時,如果輔助棧為空或者當前值小於輔助棧棧頂元素,則將當前值加入輔助棧 否則將輔助棧的棧頂元素加入輔助棧,表明此次有大於min棧頂數字入棧。以...
劍指offer 包含min函式的棧
題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。這個題要求時間複雜度是o 1 竟然想了好久沒想出來,原來思維定式了,一直在想既然要從小到大排序怎麼可能實現o 1 呢 其實由於出棧入棧是由順序的,用來記錄最小值的棧也不用完整記錄所有元素的順序,只要根據入棧的順序來就行 ...
劍指offer 包含min函式的棧
定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。思路 這裡,定義兩個棧,stack和min stack,其中,min stack的最後乙個數永遠保持是stack中最小的乙個數。具體的,在puch時,只儲存比當前最小的還要小的數。pop時,如果stack最小的數pop出,min ...