設計包含min函式的棧

2021-09-24 11:56:53 字數 1928 閱讀 1802

2019獨角獸企業重金招聘python工程師標準》

題目: 設計乙個棧,使得push、pop以及getmin(獲取棧中最小元素)能夠在常數時間內完成。

分析: 很剛開始很容易想到乙個方法,那就是額外建立乙個最小堆儲存所有元素,這樣每次獲取最小元素只需要o(1)的時間。但是這樣的話,push和pop操作就需要o(lgn)的時間了(假定棧中元素個數為n),不符合題目的要求。 那麼用1個輔助棧如何呢?

解法: 使用乙個輔助棧來儲存最小元素,這個解法簡單不失優雅。設該輔助棧名字為minimum stack,其棧頂元素為當前棧中的最小元素。這意味著 要獲取當前棧中最小元素,只需要返回minimum stack的棧頂元素即可。 每次執行push操作,檢查push的元素是否小於或等於minimum stack棧頂元素。如果是,則也push該元素到minimum stack中。 當執行pop操作的時候,檢查pop的元素是否與當前最小值相等。如果相同,則需要將改元素從minimum stack中pop出去。 **: [cpp] view plain copy struct stackgetmin

bool pop()

bool getmin(int &min) else

}stackelements;

stackminstack;

};例項: 假定有元素3, 2, 5, 4, 2, 1依次入棧,則原始棧中元素為(1), 輔助棧中元素為(2) 1

24 1 5 2 2 2 3 3 (1) (2) 這樣,第1次pop時,1從兩個棧都pop出去;第2次pop時,2從兩個棧都pop出去;第3次pop,元素4從原始棧pop出去,輔助棧不用pop;第4次pop,元素5從原始棧pop出去,輔助棧不需pop;第5次pop,元素2從兩個棧pop出去;第6次pop,元素3從兩個棧都pop出去。我們可以發現,每次push或者pop後,輔助棧的棧頂元素總是當前棧的最小元素。

另一解法(不用輔助棧) 另外一種解法利用儲存差值而不需要輔助棧,方法比較巧妙。其中需要說明的幾點: push(int elem)函式在棧中壓入當前元素與當前棧中最小元素的差值,然後通過比較當前元素與當前棧中最小元素大小,並將它們中間的較小值壓入。 pop()函式執行的時候,先pop出棧頂的兩個值,這兩個值分別是當前棧中最小值min和最後壓入的元素與棧中最小值的差值diff。如果diff<0,則表示最後壓入棧的元素是最小的元素,因此只需將min-diff壓入棧中,並將min值返回即可。min-diff就是當前元素彈出後,棧中剩下元素的最小值。而如果diff>=0且棧不為空,則表示當前值不是最小值,所以需要在棧中壓入最小值min並將diff+min返回;如果棧為空,則表示已經是最後乙個數字,直接返回min即可。 [cpp] view plain copy stacks;

void push(int elem)

else

}int pop()

else

return min;}}

int min()

乙個例項如下: clear(): [ ] push(3): [3 3] push(4): [3 1 3] push(2): [3 1 -1 2] push(5): [3 1 -1 3 2] push(1): [3 1 -1 3 -1 1] push(1): [3 1 -1 3 -1 0 1] push(6): [3 1 -1 3 -1 0 5 1] push(7): [3 1 -1 3 -1 0 5 6 1] min() --> 1; pop() --> 7: [3 1 -1 3 -1 0 5 1] min() --> 1; pop() --> 6: [3 1 -1 3 -1 0 1] min() --> 1; pop() --> 1: [3 1 -1 3 -1 1] min() --> 1; pop() --> 1: [3 1 -1 3 2] min() --> 2; pop() --> 5: [3 1 -1 2] min() --> 2; pop() --> 2: [3 1 3] min() --> 3; pop() --> 4: [3 3] min() --> 4; pop() --> 3: [ ]

設計包含min函式的棧

本文 題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 分析 這是去年google的一道面試題。我看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後p...

設計包含min函式的棧

定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素,要求函式min,push及pop的時間複雜度都是o 1 棧的資料結構包含兩個普通棧,乙個棧存資料,另乙個棧存最小值 或最小值的位置,如果用stl裡的棧,則不能存最小值的位置,因為stl裡的stack不支援下標索引訪問 cpp view ...

設計包含min函式的棧

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 注 這是06年一道google的面試題.先來說個常規解和他的乙個優化,常規解的時間複雜度符合要求,但需要線性的額外空間.常規解 參考 除了題目要求的棧之外新開乙個棧,用來記...