1. 程式人生 > >12 帶最小值操作的棧

12 帶最小值操作的棧

aps 註意 arr 入棧 com 值棧 cnblogs ESS HERE

原題網址:https://www.lintcode.com/zh-cn/problem/min-stack/#

實現一個帶有取最小值min方法的棧,min方法將返回當前棧中的最小值。

你實現的棧將支持pushpopmin 操作,所有操作要求都在O(1)時間內完成。

註意事項

如果堆棧中沒有數字則不能進行min方法的調用

您在真實的面試中是否遇到過這個題? Yes 樣例

如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

標簽 Zenefits 棧 優步 谷歌 亞馬遜 BloombergSnapchat 思路:可以創建兩個數組,一個保存棧數據,另一個保存當前棧的最小值。棧數據數組不用說,入棧出棧直接操作即可。 最小值數組,新元素入棧時判斷當前最小值(棧頂)與新元素哪個小,較小者壓入最小值數組。元素出棧時,最小值數組刪掉最後一個元素即可,兩個數組始終等長。 min函數可以直接返回最小值數組最後一個元素,該值為當前棧最小值。 AC代碼:
class
MinStack { public: MinStack() { // do intialization if necessary } /* * @param number: An integer * @return: nothing */ void push(int number) { // write your code here m_iAarray.push_back(number); if (minVal.empty()||number<minVal.back()) { minVal.push_back(number); }
else { minVal.push_back(minVal.back()); } } /* * @return: An integer */ int pop() { // write your code here int temp; if (!m_iAarray.empty()) { temp=m_iAarray.back(); m_iAarray.pop_back(); }
if (!minVal.empty()) { minVal.pop_back(); } return temp; } /* * @return: An integer */ int min() { // write your code here return minVal.back(); } vector<int> m_iAarray; vector<int> minVal; };

參考:https://www.cnblogs.com/theskulls/p/5098271.html

另一種思路,用兩個棧,一個保存數據,一個保存當前最小值,效率更高。參考:https://blog.csdn.net/ljlstart/article/details/48517703

這種方法當入棧時,判斷新元素是否小於或等於當前最小值(最小值棧棧頂),小於則push新值更新最小值棧,否則維持原樣。

刪除元素時判斷要刪除的值是否是當前最小值,如果是,最小值棧刪除當前棧頂,更新最小值。

12 帶最小值操作的棧