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 ;
    }
};

原文地址:https://www.cnblogs.com/maskmtj/p/9326450.html

时间: 2024-10-06 13:09:05

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

刷题6 从尾到头打印链表

描述:  输入一个链表,从尾到头打印链表每个节点的值. 最初思路: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * ListNode(int x) : 6 * val(x), next(NULL) { 7 * } 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> printListFromTailToHead(ListNode* he

每日一题21:从0打印到具有n位整数的最大数

该题目的难点在于n可能很大,超过了整数表示的范围,所以一般有两种思路,一种是用字符串表示整数,并实现++操作符,另一种是把该题目当做排列组合来做,使用递归可以实现,下面给出使用递归实现的代码: void __print(char digit_array[], int index, int n) { if (index < 0) return; if (index == n - 1) { digit_array[index] = '0'; //从0开始 for (int i = 0; i < 1

面试刷题21:java并发工具中的队列有哪些?

![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png) java的线程池的工作队列用到了并发队列.队列一般用在生产者消费者的场景中,处理需要排队的需求. 你好,我是李福春,今天的问题是: ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别? 答:都是java提供的并发安全队列,都提供了等待性的操作,take,

LeetCode刷题 笨方法 100%通过

今天闲来无事去力扣刷题 有一道题 百思不得其解 又不想去看题解 (习惯答完之后去看) 就想到一个特别‘机智’的方法(*/ω\*) 题目: 如果我们交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似. 例如,"tars" 和 "rats" 是相似的 (交换 0 与 2 的位置): "rats" 和 "arts" 也是相似的,但是 "star" 不与 "

剑指offer刷题记录

[TOC] 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路:从右上角的元素进行判断,如果大于target说明这一列肯定都不是,所以将列数见一:如果小于target说明可能在下一行是等于target的,所以这一行都不是解,所以将行数加1.这样通过一个循环进行判断即可. class Solution { public: bool Find(int tar

编程日志&amp;&amp;刷题日志&amp;&amp;开发日志迁移之碎碎念

Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7, 11, 15]

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【leetcode刷题笔记】Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4. Your algorithm should run in

【leetcode刷题笔记】Validate Binary Search Tree

Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys