• c++刷题(21/100)树的打印、矩阵覆盖和括号生成


    题目一:把二叉树打印成多行

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问,所以这道题就是用两个队列,第一个队列q1放一层,然后把这层的孩子节点都塞到第二个队列q2,之后再从第二个队列q2把节点一个一个塞回队列q1里,然后重复这个流程直到q1为空

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
            vector<vector<int>> Print(TreeNode* pRoot) {
                vector<vector<int>> ans ;
                queue<TreeNode*> q1, q2;
                if(pRoot==NULL){
                    return ans ;
                }
                q1.push(pRoot) ;
                vector<int> layer ;
                while(!q1.empty()){
                    layer.clear() ;
                    while(!q1.empty()){
                        TreeNode* tempRoot = q1.front() ;
                        if(tempRoot->left!=NULL){
                            q2.push(tempRoot->left) ;
                        }
                        if(tempRoot->right!=NULL){
                            q2.push(tempRoot->right) ;
                        }
                        layer.push_back(tempRoot->val) ;
                        q1.pop() ;
                    }
                    ans.push_back(layer) ;
                    while(!q2.empty()){
                        q1.push(q2.front()) ;
                        q2.pop() ;
                    }
                }
                //printLayer(pRoot,0,ans) ;
                return ans ;
            }
        
    };

    题目二:矩阵覆盖

    我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    思路:从最开始n=1的情况开始想,设m(n)为值取n的方法数量,可得递推式:m(n)= m(n-1)+ m(n-2) ,关键就是要固定方向,从左边开始铺和从右边开始是一样的

    class Solution {
    public:
        int rectCover(int number) {
            if(number<=0) return 0 ;
            if(number==1) return 1 ;
            if(number==2) return 2 ;
            return rectCover(number-1)+rectCover(number-2) ;
        }
    };

    题目三:括号生成

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

    例如,给出 = 3,生成结果为:

    [
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]

    思路:就是递归找到合适的解就加到全局的vector中,给定n之后,string的长度不会超过2n,所以到0的时候判断一下结果是不是合法就行
    class Solution {
    public:
        void build(int n, int s, string str, vector<string> &ans){
            if(n==0){
                if(s==0)ans.push_back(str) ;
                return ;
            }
            if(s==0){
                build(n-1,1,str+"(",ans) ;
            }else{
                build(n-1,s+1,str+"(",ans) ;
                build(n-1,s-1,str+")",ans) ;
            }
        }
        vector<string> generateParenthesis(int n) {
            vector<string> ans ;
            build(n*2,0,"",ans) ;
            return ans ;
        }
    };
  • 相关阅读:
    大数据基本概念及Hadoop技术基础
    基于 ReliefF和K-means算法的应用
    利用Hadoop和Spark处理用户心跳周期数据
    Java线程池源码解析及高质量代码案例
    muleESB的第一个开发实例-HelloWorld(二)
    [USACO11JAN]道路和飞机Roads and Planes
    CH6101 最优贸易
    POJ3662 Telephone Lines
    扫描线+线段树例题(HDU1542)
    关于Dinic算法的几点讨论
  • 原文地址:https://www.cnblogs.com/maskmtj/p/9326450.html
Copyright © 2020-2023  润新知