输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
代码
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int len = pushV.size();
vector<int> in;
for(int t=0;t<len;t++){
in.push_back(1);
};
//全部存放1
int i,j,m=0,n;
n=len-1;
i = FindI(popV[m],pushV,len);
if(i==-1){
return false;
};
while(n>0){
m++;
j=FindI(popV[m],pushV,len);
if(j==-1){
return false;
};
int um=0;
if(i<j){
in[j]=0;
for(j;j>=i;j--){
um+=in[j];
};
//j++;
}else
{
//in[i]=0;
for(i;i>=j;i--){
//cout<
um+=in[i];
}
//in[i+1]=0;
i=j;
}
n--;
if(um>2){
return false;
};
}
return true;
};
int FindI(int n,vector<int> pushV,int len)
{
for(int i=0;i<len;i++){
if(n==pushV[i]) return i;
};
return -1;
};
};
总结
我使用的是一次遍历,时间复杂度为O(N) ,定义一个辅助数组,来存储对应的位置,并初始化为1,遍历之后设置为0,在根据两个数据的位置来判断是否符合出栈顺序要求。