题目来源:牛客网-剑指Offer专题
题目地址:矩形覆盖

题目描述

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

比如n=3时,2∗32*32∗3的矩形块有3种覆盖方法:

题目解析

其实这类题目,如果实在不知道怎么下手,都不妨先考虑枚举,将前面小的数先枚举出来,然后再猜测规律是什么。一般可以考虑的式子有 2n−12^{n-1}2n−1 、斐波那契数列、n相关的多项式、组合数、卡特兰数、欧拉函数……

这看这道题,我们先把 nnn 比较小的情况先枚举出来,如下表所示:

n 1 2 3 4 5 6
result 1 2 3 5 8 13

看,不骗你们吧!这不是斐波那契数列吗?我不是坑你们,只是在实在无从下手的时候给你们提供一种思路,别动不动就写什么搜索去枚举这些情况……


下面是正解时间:

参考了讨论区中Follow大佬的讲解思路,假设我们有一个 2∗n2*n2∗n 的大矩形,当 n=in=in=i时的方法有 f(i)f(i)f(i) 种,我们先考虑第一个 2∗12*12∗1 小矩形的摆法。有下面两种情况:

  • 情况一:如下图竖着摆放,那么剩下的矩形就形成了一个 2∗(n−1)2*(n-1)2∗(n−1) 的大矩形,所以这种情况下的覆盖方法有 f(n−1)f(n-1)f(n−1) 种。
*
*
  • 情况二:如下图横着摆放,为了把它下方的空间覆盖,第二个 2∗12*12∗1 小矩形也必须横着摆在它的下方,,那么剩下的矩形就形成了一个 2∗(n−2)2*(n-2)2∗(n−2) 的大矩形,所以这种情况下的覆盖方法有 f(n−2)f(n-2)f(n−2) 种。
* *
- -

于是,我们就可以知道 f(n)=f(n−1)+f(n−2)f(n)=f(n-1) + f(n-2)f(n)=f(n−1)+f(n−2),再结合 n−2≤0n-2 \leq0n−2≤0 的情况,我们就可以得到以下的递推式啦~

f(n)={1,n=12,n=2f(n−1)+f(n−2),n>2f(n)= \begin{cases} 1&, \text{n=1} \\ 2 &,\text{n=2} \\ f(n-1) + f(n-2) &,\text{n>2} \end{cases} f(n)=⎩⎪⎨⎪⎧​12f(n−1)+f(n−2)​,n=1,n=2,n>2​

这个递推式看烂了,这里就简单写常用的两种实现方式,详情可以参考上篇博客解法:斐波那契数列(四种解法)。

方法一:
面试别写型递推版实现,时间复杂度 O(2n)O(2^n)O(2n)。

public class Solution {public int RectCover(int n) {if (n < 3) {return n;}return RectCover(n - 1) + RectCover(n - 2);}
}

方法二:
面试推荐型,自底向上型循环求解,时间复杂度为 O(n)O(n)O(n)。

public class Solution {public int RectCover(int n) {if (n == 0) return 0;int a = 1, b = 1;for (int i = 1; i < n; i++) {a = a + b;b = a - b;}return a;}
}

如果本文对你有所帮助,要记得点赞哦~

剑指Offer #10 矩形覆盖(问题分析)相关推荐

  1. 剑指offer:矩形覆盖 python 实现

    题目 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路 简单的推一下,又是斐波那契数列 # -*- co ...

  2. 剑指offer:矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: 和跳台阶那道题差不多.分别以矩形的两条边长做拓 ...

  3. 剑指offer十:矩形覆盖

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路如下: 当第一次横着覆盖时,覆盖方法为f(n-2); 当 ...

  4. Python剑指offer:矩形覆盖问题

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

  5. 【剑指offer】矩形覆盖

    一.题目: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 二.思路: 斐波那契数列 三.代码:      转载于:h ...

  6. 《剑指Offer》 矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 这题和前面的那道跳台阶是一模一样的题,也是动态规划 ...

  7. 剑指offer之矩形覆盖问题

    问题描述 我们可以用2×12\times 12×1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2×12\times 12×1的小矩形无重叠地覆盖一个2×n2\times n2×n的大矩形,总共有多 ...

  8. 剑指offer Q10 矩形覆盖

    题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 这不还是斐波那契数列!怎么回事 直接上代码 class Solu ...

  9. 剑指Offer(10)有环链表 翻转链表

    剑指offer(10) 有环链表 反转链表 题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路: 快慢指针,当前一个指针和后一个指针相遇时,有环,提前结束则无. ...

最新文章

  1. 电磁场与电磁波第四章 时变电磁场
  2. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK
  3. 虚拟机安装CentOS,网络配置
  4. 机器学习性能度量(2):错误接受率 (FAR), 错误拒绝率(FRR),EER计算方法,python实现
  5. 只需单插槽的空间,即可拥有极致的视觉计算性能
  6. 微软宣布已获批:重新向华为出口软件!
  7. bat命令调用rar进行文件夹压缩
  8. cs231n assignment3
  9. excel按模板导出
  10. nohub java -jar xx.jar /dev/null 21 以及/dev/null是什么 21又是什么?
  11. c语言如何输出数组最大值和最小值,C语言输出数组中最大和次大的数
  12. Homegrown【翻译】
  13. Vue 3.0 Ref-sugar 提案到底是啥,真的是自寻死路吗?
  14. EasyUI的Vue版本
  15. 电影天堂爬去示例基础2
  16. 千年古刹南普陀寺义工十年发展已逾6000人
  17. 【OpenCV图像处理】十五、图像空域滤波(上)
  18. 每逢佳节胖三斤? 春节过后天猫上家用健身机3天被疯抢10万台
  19. 收费数万元的考研“协议班”藏猫腻,授课质量差,退费老大难
  20. 短视频发展高峰论坛召开 爱奇艺号开放打通短视频创作、分发、货币化中枢

热门文章

  1. Linux Kernel 5.14 arm64异常向量表解读-中断处理解读
  2. Android locksettings/gatekeeper代码导读
  3. IDA分析shellcode导入windows结构体
  4. php中单引号与双引号的区别
  5. 【PHP】curl_init() 如何排错????
  6. 2.1 线性表的定义和基本操作
  7. linux结束ping进程,linux常用命令
  8. oracle可以迁徙mysql吗_项目oracle迁徙到mysql的小总结
  9. sql 新建发布 找不到存储过程_pgRouting教程九:使用GeoServer发布WMS/WFS接口
  10. 沸腾了!苏宁全员涨薪,每月最高多1万6!网友:这一刻,我希望我是苏宁人...