面試題 棧的最大值問題

2021-06-12 23:22:30 字數 1962 閱讀 2843

常數時間求棧的最大值

問題描述:

乙個棧stack,具有push和pop操作,其時間複雜度皆為o(1)。

設計演算法max操作,求棧中的最大值,該操作的時間複雜度也要求為o(1)。

可以修改棧的儲存方式,push,pop的操作,但是要保證o(1)的時間複雜度,空間時間複雜度無要求。

演算法描述:

乙個儲存所有最大值的棧sm。

1. 當push入棧的元素大於當前最大元素,將該元素壓入最大值棧sm;

2. sm棧頂始終儲存棧中當前的最大元素;

3. 當前最大元素被pop出棧時,將sm棧頂的對應最大元素也彈出棧。

max操作即為獲得sm棧頂最大元素。

假設元素以5,4,1,2,3,10,9,8,6,7,15順序入棧,則兩個棧中儲存的元素如下圖所示:

常數時間空間求棧的最大值

問題描述:

乙個整數棧stack,具有push和pop操作,其時間空間複雜度皆為o(1)。

設計演算法max操作,求棧中的最大值,該操作的時間空間複雜度也要求為o(1)。

可以修改棧的儲存方式,push,pop的操作,但是要保證o(1)的時間空間複雜度。

演算法描述:

變數max儲存當前最大元素值,初始值為最小整數m。

1. 當push入棧時,將(當前元素-max)存入棧中,

若當前元素小於max,棧中元素為負數;

若當前元素大於等於max,棧中元素為非負數,將max替換為當前元素。

2. 當pop出棧時,

若棧中元素為負數,則將(棧中元素+max)彈出棧;

若棧中元素為非負數,則將max彈出棧,並將max替換為(max-棧中元素)。

3. max即為當前棧中最大元素值。

主要思路是將最大值以某種方式在原有棧中標記出來,從而減少空間使用。可以用正負數來區分普通元素和最大值元素:

普通元素使用負數儲存(元素-max);

最大值元素使用非負數儲存(new max - old max);

這樣便可在棧中區分普通元素和最大值元素,並可通過max恢復old max。

假設元素以5,4,1,2,3,10,9,8,6,7,15順序入棧,則兩個棧中儲存的元素如下圖所示:

1. 元素5,4,1,2,3入棧後的情況

2. 元素10,9,8,6,7入棧後的情況

3. 元素15入棧後的情況

4. 元素15出棧時的情況

5. 元素15出棧後的情況(恢復原有狀態)

(修正:最後一圖,max改為10,棧中最右邊的格仔為空,當時畫圖手抖畫錯了...= =#)

面試題1 棧的最大值問題

面試題 棧的最大值問題 常數時間求棧的最大值 問題描述 乙個棧stack,具有push和pop操作,其時間複雜度皆為o 1 設計演算法max操作,求棧中的最大值,該操作的時間複雜度也要求為o 1 可以修改棧的儲存方式,push,pop的操作,但是要保證o 1 的時間複雜度,空間時間複雜度無要求。演算...

面試題 佇列的最大值

滑動視窗的最大值。給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,它們的最大值分別為。很有想法的解決方案 vectormaxinwindows const vector num,unsigned int size vecto...

面試題59 II 佇列的最大值

請定義乙個佇列並實現函式 max value 得到佇列裡的最大值,要求函式max value push back 和 pop front 的時間複雜度都是o 1 若隊列為空,pop front 和 max value 需要返回 1 示例 1 輸入 maxqueue push back push ba...