1. 程式人生 > >包含min函式的棧---劍指offer

包含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; };