棧表中獲取最小值,時間複雜度為O(1)
阿新 • • 發佈:2018-10-31
近期複習資料結構,看到網上有一道演算法題,該題目曾經是google的一道面試題,國內的網際網路公司也紛紛效仿。我也順便複習之。
題目內容為:對現在的stack(棧)資料結構進行改進,加一個min()功能,使之能在常數,即o(1),時間內給出棧中的最小值。可對push()和pop()函式進行修改,但要求其時間複雜度都只能是o(1)。
解題思路:1.由於題目要求的是一個棧,所以想要通過棧內元素進行排序,這個是不可行的。
2.由於存在每次的push和pop操作。所以,通過在入口設定最小值,然後不斷更新最小值的方式也是不可取的。因為,pop一次之後就失效了。
解決方案是通過輔助棧表,由於題目只要求獲得棧內剩餘元素中的最小值,並沒有要求每次pop出來的是最小值,我自己就陷入了這個思維。所以我們可以通過輔助棧,即資料棧每push一次,輔助棧也push一次,push的值為資料棧中的當前最小值。經過如此,最後,輔助棧每次push就均可獲得資料棧中的最小值。
下面提供相關的示例程式碼:
// // main.cpp // 棧最小值 // // #include <iostream> #include <assert.h> #include <deque> using namespace std; #define MAX_SIZE 100 template<typename T>//考慮到資料的多樣性,採用模版 class DataStack { T dataList[MAX_SIZE]; T minList[MAX_SIZE]; int top;//棧頂標記 public: DataStack(){top = -1;} void Push(T &value); T Pop(); T GetMin(); }; template<typename T> void DataStack<T>::Push(T &value){ top++; dataList[top] = value; if (top == 0) { minList[top] = value; } else{ if (value < minList[top-1]) { minList[top] = value; } else{ minList[top] = minList[top - 1]; } } }; template<typename T> T DataStack<T>::Pop(){ minList[top] = 0; return dataList[top--]; } template <typename T> T DataStack<T>::GetMin(){ return minList[top]; } int main(int argc, const char * argv[]) { // insert code here... DataStack<int> dataList; int temp=9; dataList.Push(temp); temp = 8; dataList.Push(temp); temp = 13; dataList.Push(temp); temp = 35; dataList.Push(temp); cout<<dataList.GetMin()<<endl; dataList.Pop(); cout<<dataList.GetMin()<<endl; dataList.Pop(); cout<<dataList.GetMin()<<endl; dataList.Pop(); cout<<dataList.GetMin()<<endl; dataList.Pop(); return 0; }