zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    };
  • 相关阅读:
    jqGrid学习笔记(二)
    jqGrid学习笔记(一)
    MVC 无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.IList<Mvc3Modeltest.Models.Movie>”。存在一个显式转换(是否缺少强制转换?))
    在页面中使用Ajax.ActionLink 的一些用法
    如何在web.config中存储自定义对象
    ASP.NET_4.0_与_Entity_Framework_4-第四篇-Entity_Framework在三层架构中的使用
    ASP.NET 4.0 与 Entity Framework 4-第三篇-使用Entity Framework调用存储过程
    ASP.NET 4.0 与 Entity Framework 4-第二篇-使用Entity Framework 进行CRUD操作
    ASP.NET_4.0_与_Entity_Framework_4-第一篇-采用Model-First_开发方式创建数据库
    String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}
  • 原文地址:https://www.cnblogs.com/simplekinght/p/8696304.html
Copyright © 2011-2022 走看看