Implement a stack with min() function, which will return the smallest number in the stack.
It should support push, pop and min operation all in O(1) cost.
1.
用map记录所有值和出现的次数,根据map有序的特征取出最小值
class MinStack {
public:
MinStack(){
// do initialization if necessary
}
void push(int number) {
// write your code here
s.push(number);
m[number]++;
it = m.begin();
}
int pop() {
// write your code here
int res=s.top();
s.pop();
if(res==it->first){
(it->second)--;
if(it->second==0){
m.erase(it);
it=m.begin();
}
}else{
m.erase(res);
}
return res;
}
int min() {
// write your code here
return it->first;
}
private:
stack<int> s;
map<int,int> m;
map<int,int>::iterator it;
};
2.
维护一个存放每阶段最小值的栈
这个代码就很简洁,推荐
class MinStack {
public:
MinStack() {
// do initialization if necessary
}
void push(int number) {
// write your code here
S.push(number);
if(minS.empty() || number<=minS.top()){
minS.push(number);
}
}
int pop() {
// write your code here
int res=S.top();
S.pop();
if(res==minS.top()){
minS.pop();
}
return res;
}
int min() {
// write your code here
return minS.top();
}
private:
stack<int> S;
stack<int> minS;
};