方法一:辅助栈
时间复杂度O(2N)空间复杂度O(N)
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int size = pushed.size(),pop=0,push=0;
stack<int> sta;
while(push<size){
sta.push(pushed[push]);
push++;
while(!sta.empty()&&pop<size&&sta.top()==popped[pop]){
pop++;
sta.pop();
}
}
return sta.empty();
}
};
方法二:
记录一个最大弹出序号,在这个序号之前还未弹出的数必须顺序弹出
时间复杂度O(2N),空间复杂度O(2N)
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int size = pushed.size(),curpop,maxpop=-1;
unordered_set<int> popped_set;
unordered_map<int,int> index;
for(int i = 0;i<size;i++){
index[pushed[i]]=i;
}
for(int i = 0;i<size;i++){
curpop = index[popped[i]];
maxpop = max(maxpop,curpop);
popped_set.insert(curpop);
if(curpop<maxpop){
for(int i = curpop+1;i<maxpop;i++){
if(!popped_set.count(i)) return false;
}
}
}
return true;
}
};