题意:按要求设计堆栈。
思路:当弹出的元素是最小值时,重新搜索整个堆栈。
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
minval = 2147483647;
}
void push(int x) {
if(x < minval) minval = x;
v.push_back(x);
}
void pop() {
int temp;
temp = v.back();
v.pop_back();
if(temp == minval) {
minval = 2147483647;
for(int i = 0; i < v.size(); ++ i) {
if(minval > v[i]) minval = v[i];
}
}
}
int top() {
return v.back();
}
int getMin() {
return minval;
}
vector<int> v;
int minval;
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
但是, 这样的思路不是O(1) 的。为实现这样的复杂度,我们需要维护一个最小栈,用来保存到目前为止堆栈中的最小元素。
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
mys.push(x);
if(mins.empty()) mins.push(x);
else {
if(mins.top() > x) mins.push(x);
else mins.push(mins.top());
}
return;
}
void pop() {
mys.pop();
mins.pop();
return;
}
int top() {
return mys.top();
}
int getMin() {
return mins.top();
}
private:
stack<int> mys;
stack<int> mins;
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/