12 帶最小值操作的棧
阿新 • • 發佈:2018-04-23
aps 註意 arr 入棧 com 值棧 cnblogs ESS HERE
原題網址:https://www.lintcode.com/zh-cn/problem/min-stack/#
實現一個帶有取最小值min方法的棧,min方法將返回當前棧中的最小值。
你實現的棧將支持push,pop 和 min 操作,所有操作要求都在O(1)時間內完成。
註意事項
如果堆棧中沒有數字則不能進行min方法的調用
您在真實的面試中是否遇到過這個題? Yes 樣例如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1
標簽 Zenefits 棧 優步 谷歌 亞馬遜 BloombergSnapchat 思路:可以創建兩個數組,一個保存棧數據,另一個保存當前棧的最小值。棧數據數組不用說,入棧出棧直接操作即可。 最小值數組,新元素入棧時判斷當前最小值(棧頂)與新元素哪個小,較小者壓入最小值數組。元素出棧時,最小值數組刪掉最後一個元素即可,兩個數組始終等長。 min函數可以直接返回最小值數組最後一個元素,該值為當前棧最小值。 AC代碼:classMinStack { 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 帶最小值操作的棧