LeetCode 155. Min Stack
难点在于如果在调用getMin()时只花常数时间。
维护两个vector,v存push进来的数,minHist存最小的数,这个最小的数是指v中从头到对应位置里最小的数,比如minHist中位置为i的数,这个数是v中从0到i(均包含)的所有数中最小的数,举个例子,依次push进4、5、1,那么minHist里依次push进4、4、1,这样一来,v里每pop掉一个数,minHist也对应pop掉一个数,minHist.top()永远为v中最小数。
1 class MinStack { 2 public: 3 void push(int x) { 4 v.push_back(x); 5 if(minHist.empty()) minHist.push_back(x); 6 else minHist.push_back(min(minHist.back(), x));//!!! 7 } 8 9 void pop() { 10 v.pop_back(); 11 minHist.pop_back(); 12 } 13 14 int top() { 15 return v[v.size() - 1]; 16 } 17 18 int getMin() { 19 return minHist.back(); 20 } 21 private: 22 vector<int> v; 23 vector<int> minHist; 24 };
还有不用两个vector的算法,留坑。
https://leetcode.com/discuss/91887/why-two-stacks