剑指offer——矩形覆盖问题

2023-10-27

题目描述

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

思路一:

深度优先搜索,从(0,0)开始遍历,判断此格子情况,判断能否竖着放、横着放,把所有情况试探一遍。

class Solution {
public:
    int a[2][100];
    int rectCover(int number) {
        for(int i=0;i<100;i++){
            a[0][i]=0;
            a[1][i]=0;
        }
        int res=0;
        dfs(number,0,0,res);
        return res;
    }
    void dfs(int n,int x,int y,int &res){
        if(x==1 && y>=n-1){ //全部铺满了 此处y>=n-1与y>n-1等价  因为没有只剩下一个格子的情况
            res++;
            return;         //一定要return
        }
        if(a[x][y]==1)      //此格子已经铺了
        {
            dfs(n,x,y+1,res);
            return;         //一定要return

        }
        if(y>=n)            //该铺下一行了 不用判断x 因为第一个if语句过滤了x==1的情况
        {
            dfs(n,1,0,res);
            return;         //一定要return
        }
        //先考虑竖着铺
        if(x==0){
            a[0][y]=1;
            a[1][y]=1;
            dfs(n,x,y+1,res);
            a[0][y]=0;      //记住要回溯哦
            a[1][y]=0;      //记住要回溯哦
        }
        //判断能不能横着铺
        if(y+1<n){
            a[x][y]=1;
            a[x][y+1]=1;
            dfs(n,x,y+2,res);
            a[x][y]=0;      //记住要回溯哦
            a[x][y+1]=0;    //记住要回溯哦
        }   
    }
};


思路二:

递归或者动态规划

格子列数  1   2   n

排法数量  1   2   ?

格子列数到排法数量的映射关系记为F

当格子列数大于2时,我们这样把问题拆解:F(n)=F(n-1)+F(n-2)

把排列问题分两类,每类分两步:

       类一  ①(0,0)位置横着放一个,那么(1,0)位置必然也要横着放

                ②已经覆盖了 2×2的区域,2×(n-2)的区域覆盖方法有F(n-2)个

       类二  ①(0,0)位置竖着放一个

                ②已经覆盖了 2×1的区域,2×(n-1)的区域覆盖方法有F(n-1)个

分类相乘,分步相加, 结果为  1×F(n-1) + 1×F(n-2) 

同时结果集也是一个斐波那契数列

class Solution {
public:
    int rectCover(int number) {
        if(number<=2)return number;
        int a=1;
        int b=2;
        int res;
        for(int i=3;i<=number;i++){
            res=a+b;
            a=b;
            b=res;
        }
        return res;
    }
};

总结:方法二是时间复杂度与空间复杂度均远小于方法一,方法一被完爆

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指offer——矩形覆盖问题 的相关文章

随机推荐

  • [WSL2+ROS (就不用虚拟机] 无法使用图形界面

    按照教程 rosrun打开小乌龟时失败 尝试查找原因发现wsl被微软阉割过没有图形界面 按照教程 转载安装VcXsrv图形界面 到这一步时如教程所说出现Cant open display的错误 更改DISPLAY 依旧报错 头痛 后尝试将D
  • ubuntu系统常用软件工具

    1 terminator Ubuntu系统默认没有安装Terminator 我们可以使用apt get命令从Ubuntu的软件源中下载并安装该软件 在GNOME集成桌面环境中 打开一个终端窗口 输入以下命令 sudo apt get ins
  • 百度飞桨PicoDet 目标检测介绍

    4 head 4 1 cls分类信息 4 2 reg位置回归信息 Generalized Focal Loss 重点是边框回归的位置信息 这里和常规的Anchor box的回归方式不一样 采用的是Generalized Focal Loss
  • 自媒体素材网站有哪些?推荐几个常用的素材网站

    无论是写公众号图文 还是剪辑视频 都需要大量的素材 所以就跟大家介绍一下素材类的网站 1 视频类素材 第一批 就是一些无版权的素材网站 Pexel Video Pexel Video Pexel Video Mazwai等 这些网站里面的视
  • 接口测试之Fiddler抓包,定位接口测试问题详细教程

    Fiddler应用实战 面试必问且测试必会的技术 一 Fiddler部署与原理 1 Fiddler是什么 Fiddler是位于客户端和服务器端的HTTP代理 也是目前最常用的http抓包工具之一 什么是包 什么抓包 什么情况下需要抓包 我们
  • 缓存服务——Redis集群简介

    文章目录 缓存服务 Redis集群 一 Redis简介 1 Redis软件获取和帮助 2 Redis特性 3 企业缓存数据库解决方案对比 4 Redis应用场景 二 Redis基本部署 1 编译安装最新版本redis 2 配置启动数据库 3
  • MakeFile学习2-语法

    makefile语法 什么是makefile makefile定义了一系列的规则来指定 哪些文件需要先编译 哪些文件需要重新编译 如何进行链接等操作 makefile就是自动化编译 告诉make命令如何编译和链接 makefile里有什么
  • 【开发工具】JetBrains

    文章目录 设置 插件 字体 设置 File Settings Appearance Behavior Appearance Theme IntelliJ Light Use custom font JetBrains Mono ExtraL
  • web编程自动化测试_2020年用于测试自动化的7种顶级编程语言

    web编程自动化测试 因此 您正处于2020年初 您可能已将一个新的决议作为测试人员投入到自动化测试中来 但是 要自动化测试脚本 您需要动手学习一种编程语言 这就是您的难处 或者您已经精通一种编程语言进行自动化测试 并且正在考虑尝试使用新的
  • 算法 - C语言实现希尔排序(Shell_sort)

    目录 什么是希尔排序 希尔排序的使用场景 通过排序之间的比较引入希尔排序 演示希尔排序的过程 第一趟排序 第二趟排序 第三趟排序 第四趟排序 程序验证 程序代码 现实生活中的希尔排序 对希尔排序的总结 什么是希尔排序 在写希尔排序的代码之前
  • 单调栈的使用

    一 介绍 单调栈 顾名思义就是栈内元素是有单调性的栈 单调栈在入栈的时候 需要将待入栈的元素和栈顶元素进行对比 看待加入栈的元素入栈后是否会破坏栈的单调性 如果不会 直接入栈 否则一直弹出到满足条件为止 单调栈何时用 为任意一个元素找左边和
  • Flask全栈解决小问题系列(1)搭建一个bootstrap开发框架

    时间不多 闲话少说 实践出真知 1 目的 为实现Flask BootStrap开发效果 搞个开发测试项目 2 搭建项目 1 建个test bootstrap项目 项目目录结构如下 2 appstart py内容如下 import json
  • 函数柯里化

    柯里化 Currying 柯里化 Currying 1 是一种关于函数的高阶技术 它不仅被用于 JavaScript 还被用于其他编程语言 柯里化是一种函数的转换 它是指将一个函数从可调用的 f a b c 转换为可调用的 f a b c
  • shiro1.2.4反序列化(CVE-2016-4437)

    目录 shiro1 2 4反序列化 CVE 2016 4437 漏洞原理 利用链和回显方式 vulhub环境 判断shiro 图形化工具利用 ysoserial利用 Shiro exploit脚本利用 vulapps环境 判断shiro s
  • MySQL 高级(进阶) SQL 语句 (一)

    目录 环境 创建表 一 order by语句 二 升序与降序 ASC和DESC 三 select查询 四 and or 且 或 五 where 六 distinct 查询不重复记录 七 group by 对结果进行分组 八 limit 九
  • Unity开发基础——基本数据类型学习笔记

    Unity开发基础基本数据类型学习笔记 sbyte byte short ushort int uint long ulong8个是整数 他们之间的区别就是表示氛围不一样 而对于范围不一样的根本原因是类型在内存中的存储不同 C 常用基本数据
  • portlet窗口的状态解析

  • 使用ChatGPT处理Excel表格-终极指南

    ChatGPT是由OpenAI开发的人工智能聊天机器人 可用于各种Excel任务 以提高您的办公效率 无论您是会计师 金融分析师 经理 管理员还是其他企业专业人士 我们将讨论ChatGPT在Excel中可以帮助您的顶级方法 您会惊叹于使用C
  • Obsidian学习从0到1 —— 基本介绍

    文章目录 1 创建一个新库 2 开启实时预览 及所见即所得 3 创建的每一个内容都基于一个资料库 不能从一个资料库链接到另一个资料库 4 一个资料库的所以设置都在这里 obsidian 5 一般插件 快捷键 主题的设置属于一个资料库 但切换
  • 剑指offer——矩形覆盖问题

    题目描述 我们可以用2 1的小矩形横着或者竖着去覆盖更大的矩形 请问用n个2 1的小矩形无重叠地覆盖一个2 n的大矩形 总共有多少种方法 思路一 深度优先搜索 从 0 0 开始遍历 判断此格子情况 判断能否竖着放 横着放 把所有情况试探一遍