面試題——棧的最大值問題
常數時間求棧的最大值
問題描述:
乙個棧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,棧中最右邊的格仔為空,當時畫圖手抖畫錯了...= =#)
**:
面試題 棧的最大值問題
常數時間求棧的最大值 問題描述 乙個棧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...