剑指Offer #10 矩形覆盖(问题分析)
题目来源:牛客网-剑指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 矩形覆盖(问题分析)相关推荐
- 剑指offer:矩形覆盖 python 实现
题目 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路 简单的推一下,又是斐波那契数列 # -*- co ...
- 剑指offer:矩形覆盖
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: 和跳台阶那道题差不多.分别以矩形的两条边长做拓 ...
- 剑指offer十:矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路如下: 当第一次横着覆盖时,覆盖方法为f(n-2); 当 ...
- Python剑指offer:矩形覆盖问题
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个21的小矩形 无重叠的覆盖一个28的大矩形,共有多少种方法? * * * * * * * * * * * * * * * * * * 这 ...
- 【剑指offer】矩形覆盖
一.题目: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 二.思路: 斐波那契数列 三.代码: 转载于:h ...
- 《剑指Offer》 矩形覆盖
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 这题和前面的那道跳台阶是一模一样的题,也是动态规划 ...
- 剑指offer之矩形覆盖问题
问题描述 我们可以用2×12\times 12×1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2×12\times 12×1的小矩形无重叠地覆盖一个2×n2\times n2×n的大矩形,总共有多 ...
- 剑指offer Q10 矩形覆盖
题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 这不还是斐波那契数列!怎么回事 直接上代码 class Solu ...
- 剑指Offer(10)有环链表 翻转链表
剑指offer(10) 有环链表 反转链表 题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路: 快慢指针,当前一个指针和后一个指针相遇时,有环,提前结束则无. ...
最新文章
- 电磁场与电磁波第四章 时变电磁场
- float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK
- 虚拟机安装CentOS,网络配置
- 机器学习性能度量(2):错误接受率 (FAR), 错误拒绝率(FRR),EER计算方法,python实现
- 只需单插槽的空间,即可拥有极致的视觉计算性能
- 微软宣布已获批:重新向华为出口软件!
- bat命令调用rar进行文件夹压缩
- cs231n assignment3
- excel按模板导出
- nohub java -jar xx.jar /dev/null 21 以及/dev/null是什么 21又是什么?
- c语言如何输出数组最大值和最小值,C语言输出数组中最大和次大的数
- Homegrown【翻译】
- Vue 3.0 Ref-sugar 提案到底是啥,真的是自寻死路吗?
- EasyUI的Vue版本
- 电影天堂爬去示例基础2
- 千年古刹南普陀寺义工十年发展已逾6000人
- 【OpenCV图像处理】十五、图像空域滤波(上)
- 每逢佳节胖三斤? 春节过后天猫上家用健身机3天被疯抢10万台
- 收费数万元的考研“协议班”藏猫腻,授课质量差,退费老大难
- 短视频发展高峰论坛召开 爱奇艺号开放打通短视频创作、分发、货币化中枢
热门文章
- Linux Kernel 5.14 arm64异常向量表解读-中断处理解读
- Android locksettings/gatekeeper代码导读
- IDA分析shellcode导入windows结构体
- php中单引号与双引号的区别
- 【PHP】curl_init() 如何排错????
- 2.1 线性表的定义和基本操作
- linux结束ping进程,linux常用命令
- oracle可以迁徙mysql吗_项目oracle迁徙到mysql的小总结
- sql 新建发布 找不到存储过程_pgRouting教程九:使用GeoServer发布WMS/WFS接口
- 沸腾了!苏宁全员涨薪,每月最高多1万6!网友:这一刻,我希望我是苏宁人...