剑指Offer---出栈顺序的判断正误

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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,在根据两个数据的位置来判断是否符合出栈顺序要求。

你可能感兴趣的:(剑指Offer,数据结构,算法)