剑指offer面试题30.包含min函数的栈
一开始写的垃圾代码,push和pop都是O(N)
class Solution {
public:
vector<int> vec;
int min_val=INT_MAX,min_cnt=0;
void push(int value) {
vec.push_back(value);
if(min_cnt==0){
min_val=value,min_cnt=1;
}
else if(min_val>value){
min_val=value,min_cnt=1;
}
}
void pop() {
int val=vec.back();
vec.pop_back();
if(min_val==val){
min_cnt--;
}
if(min_cnt==0){
min_val=INT_MAX;
for(const int& x:vec){
if(min_val>x){
min_val=x,min_cnt=1;
}
else if(min_val==x){
min_cnt++;
}
}
}
}
int top() {
return vec.back();
}
int min() {
return min_val;
}
};
官方辅助栈解法,push/pop/min都是O(1),记录一下
一个数据栈单纯记录数据,一个辅助栈只记录当前栈内的最小数字(辅助栈是非递增栈),push时二者同时push,但数据栈push的只是数据,辅助栈push的是当前要push的数字和辅助栈栈顶的较小值。
比如插入3,4,1,2,数据栈为3,4,1,2
辅助栈为3,3,1,1。pop时二者一起pop。取min时只要取辅助栈的top()即可。
class Solution {
public:
stack<int> data,mi;
void push(int value) {
data.push(value);
if(mi.empty() or mi.top()>=value){
mi.push(value);
}
else{
mi.push(mi.top());
}
}
void pop() {
data.pop();
mi.pop();
}
int top() {
return data.top();
}
int min() {
return mi.top();
}
};
进击的小🐴农