剑指Offer——04天

顺时针打印矩阵

  • 普通的模拟,和2017ACM青岛站的铜牌题特别像,但是我代码写的非常差,把循环写死...先粘上来吧,一会儿学一下评论区大佬们的写法
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int d = matrix.size();
        int r = matrix[0].size();
        int sum = d*r;
        int l=0;
        int u=0;
        int i,j;
        i=0;
        j=0;
        vector <int> p;
        int num=0;
        while(1)
        {
            while(1)
            {
                p.push_back(matrix[i][j]);
                num++;
                if(j==r-1) break;
                j++;
            }
            if(num==sum) break;
            r--;
            i++;
            while(1)
            {
                p.push_back(matrix[i][j]);
                num++;
                if(i==d-1) break;
                i++;
            }
            if(num==sum) break;
            d--;
            j--;
            while(1)
            {
                p.push_back(matrix[i][j]);
                num++;
                if(j==l) break;
                j--;
            }
            if(num==sum) break;
            l++;
            i--;
            while(1)
            {
                p.push_back(matrix[i][j]);
                num++;
                if(i==u+1) break;
                i--;
            }
            if(num==sum) break;
            u++;
            j++;
        }
        return p;
    }
};

包含min函数的栈

  • 这道题没看懂题意,直接看的题解,发现果然是有巧计的,时间复杂度为O(1)
  • 在这里定义了2个栈,一个是装数据,另一个装最小值,每一次压入当前栈的最小值为多少
  • 数据栈     4 5 1 2 3
  • 最小值栈 4 4 1 2 3
class Solution {
public:
    stack <int> data_stack,min_stack;
    void push(int value) {
        if(data_stack.empty()==true)
        {
            data_stack.push(value);
            min_stack.push(value);
        }
        else
        {
            data_stack.push(value);
            int num = min_stack.top();
            if(value<num)
            {
                min_stack.push(value);
            }
            else
            {
                min_stack.push(num);
            }
        }
    }
    void pop() {
        data_stack.pop();
        min_stack.pop();
    }
    int top() {
        return data_stack.top();
    }
    int min() {
        return min_stack.top();
    }
};

栈的压入、弹出序列

  • 依旧看的题解...自己手动就看出来但是一到代码就不会编了
  • 方法是建立一个栈,模拟操作,按照入栈顺序依次压栈,每次判断栈顶元素是否为出栈元素,如果是那么就弹出,最终栈为空时正确
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack <int> s;
        int n = pushV.size();
        int j=0;
        for(int i=0;i<n;i++)
        {
            s.push(pushV[i]);
            while(popV[j]==s.top()&&j<n)
            {
                s.pop();
                j++;
            }
        }
        if(s.empty()==true) return true;
        else return false;
    }
};

从上往下打印二叉树

  • 借助队列,先将根节点入队,每次取队头元素,出队,并让它的左右子树的根节点入队,直至队列为空
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        queue <TreeNode*> q;
        vector <int> v;
        if(root==NULL) return v;
        q.push(root);
        while(q.empty()!=true)
        {
            TreeNode * r = q.front();
            q.pop();
            v.push_back(r->val);
            if(r->left!=NULL) q.push(r->left);
            if(r->right!=NULL) q.push(r->right);
        }
        return v;
    }
};

二叉搜索树的后序遍历序列

  • 没有用递归的方式去写,但是依旧过了,估计是数据少的原因吧,对于后序遍历为左右根,即小大中,所以以最后一个元素的值x为准
  • 必然能将其划分成两段,前一段都小于x,后一段都大于x
class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int n = sequence.size();
        if(n==0) return false;
        int flag=0;
        int num = sequence[n-1];
        for(int i=0;i<n-1;i++)
        {
            if(flag==0)
            {
                if(sequence[i]<num)
                {
                    continue;
                }
                else
                {
                    flag=1;
                }
            }
            else if(flag==1)
            {
                if(sequence[i]<num)
                {
                    return false;
                }
            }
        }
        return true;
    }
};

 

posted @ 2018-04-02 18:53  simpleknight  阅读(194)  评论(0编辑  收藏  举报