包含min函式的棧---劍指offer
class Solution { public: //我是用了一種非常取巧的方法,取最小值的時間複雜度為O(n); vector<int> v; //int mins=1<<31-1; void push(int value) { v.push_back(value); } void pop() { v.pop_back(); } int top() { int ret=v[v.size()-1]; return ret; } int min() { int mins=(1<<31)-1; vector<int>::iterator it; for(it=v.begin();it!=v.end();it++) { if(*it<mins) mins=*it; } return mins; } };
實際可以定義兩個實體的棧,一個棧做正常的插入操作,另一個作為維護原棧中的最小元素,其中棧頂是當前棧中的最小元素。
在維護過程中,要注意一些維護條件。
看到這個問題, 我們最開始可能會想, 新增一個成員變數用於儲存最小元素, 每次壓棧時如果壓棧元素比當前最小元素更小, 就更新最小元素.
但是這樣會有一個問題, 如果最小元素被彈出了呢, 如何獲得下一個最小元素呢? 分析到這裡可以發現, 僅僅新增一個成員變數存放最小元素是不夠的, 我們需要在最小元素彈出後還能得到次小元素, 次小的彈出後, 還要能得到次次小的.
因此, 用另一個棧來儲存這些元素是再合適不過的了. 我們叫它最小元素棧.
每次壓棧操作時, 如果壓棧元素比當前最小元素更小, 就把這個元素壓入最小元素棧, 原本的最小元素就成了次小元素. 同理, 彈棧時, 如果彈出的元素和最小元素棧的棧頂元素相等, 就把最小元素的棧頂彈出.
class Solution { public: void push(int value) { s.push(value); if(sMin.empty()) sMin.push(value); else if(value <= sMin.top()) sMin.push(value); } void pop() { if(s.top() == sMin.top()) sMin.pop(); s.pop(); } int top() { return s.top(); } int min() { return sMin.top(); } private: stack<int> s; stack<int> sMin; };