//思路首先:數組模擬棧,入棧時直接統計最小值並放入數組 class MinStack { public: MinStack() { arr.resize(100000);//多麼痛的領悟 minarr.resize(100000); ntop=-1; } void push(int x) { ++ntop; arr[ntop]=x; if(ntop==0) minum=INT_MAX; if(x<=minum) minum=x; minarr[ntop]=minum; } void pop() { minarr[ntop]=0; ntop--; } int top() { return arr[ntop]; } int getMin() { return minarr[ntop]; } private: vector<int> arr; vector<int> minarr; int ntop; int minum; };
//思路首先:數組模擬棧 //在壓棧的時候,直接統計出當前最小值minum放入數組 //出棧時,更新當前最小值minum(第一次忘了)~ class MinStack { public: MinStack() { arr.resize(100000);//多麼痛的領悟 minarr.resize(100000); ntop=-1; } void push(int x) { arr[++ntop]=x; if(ntop==0) minum=INT_MAX; if(x<=minum) minum=x; minarr[ntop]=minum; } void pop() { minarr[ntop]=0; ntop--; minum=minarr[ntop];//上面的代碼缺少這一行 } int top() { return arr[ntop]; } int getMin() { return minarr[ntop]; } private: vector<int> arr; vector<int> minarr; int ntop; int minum; };
學習別人家的算法設計:他這樣處理其實還是在壓棧時就獲取了最小值。
相較普通的棧,題目要求多實現一個操作getMin(): 獲取棧中最小的元素
我們維護兩個棧:普通棧s保存所有元素, 最小棧mins保存s中的“曾出現過”的最小元素的遞減序列。
mins.top()即為getMin()的返回值,標識普通棧s裡的最小元素。
考慮壓棧 3 4 5 2 3 1, 它們有如下表現:
push 3 4 5 2 3 1
s 3 4 5 2 3 1
mins 3 2 1
亦即,當push(x)的x < mins.top()時,我們將x壓入mins中。
大家可以發現,在上述push操作的任意間隔加我們若調用getMin()函數,mins.top()即為所求。
接下來考慮pop()操作,當且僅當s.top() == mins.top()時,我們才彈出mins的元素,這樣就可以維護mins.top()始終為當前s裡的最小值的性質。
class MinStack { public: void push(int x) { s.push(x); if (mins.empty() || x <= mins.top() ) mins.push(x); } void pop() { if (mins.top() == s.top()) { s.pop(); mins.pop(); } else { s.pop(); } } int top() { return s.top(); } int getMin() { return mins.top(); } private: stack<int> s; stack<int> mins; };