1. 程式人生 > >c++刷題(21/100)樹的打印、矩陣覆蓋和括號生成

c++刷題(21/100)樹的打印、矩陣覆蓋和括號生成

生成 一個 ring 第一個 pop 全局 over 矩形 node

題目一:把二叉樹打印成多行

從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思路:一開始以為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 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 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 ;
    }
};

c++刷題(21/100)樹的打印、矩陣覆蓋和括號生成