剑指offer系列之九:矩形覆盖问题

简介:

题目描述

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

我们采用从能够简单到复杂的思路思考这个问题,当n=1的时候,只有一个2*1的矩形,所以只有一种方法,记为f(1)=1;当n=2的时候,是两个2*1的矩形,这时候具有两种方式去覆盖这个矩形了(这时候应该是一个正方形),一种是竖着放,一种是横着放,所以有两种方法,记为f(2)=2;

当n=3的时候,仍然只能采用横着放或者竖着放的方式去覆盖这个矩形,我们仍首先考虑使用竖着放的方式,当竖着放的时候,由于已经覆盖了左边(假设是从左边开始覆盖的,从右边的覆盖的效果是一样的)一个2*1的矩形,所以还有2个2*1的矩形,而这种情况我们已经在n=2的时候计算出来了,就是f(2);接下来我们考虑横着放的情况,由于是横着放,在水平方向已经覆盖了一个2*1的矩形,所以要想覆盖这由3个2*1组成的矩形,只能在水平方向的覆盖的那个矩形下面继续覆盖一个,那么只剩下一个2*1的矩形了,这也通过前面的分析计算出来了,就是f(1)。综合以上分析,当n=3的时候,覆盖的方法是f(3)=f(1)+f(2)。

其他以此类推,我们发现这仍然是一个斐波那契数列,所以我们写出如下代码(已被牛客AC):

public int RectCover(int target) {
        if(target <= 0) return 1;
        if(target == 1 || target == 2) return target;
        return RectCover(target - 1) + RectCover(target - 2);
    }
AI 代码解读
目录
打赏
0
0
0
0
85
分享
相关文章
【剑指offer】-矩形覆盖-10/67
【剑指offer】-矩形覆盖-10/67
【剑指offer】-左旋转字符串-41/67
【剑指offer】-左旋转字符串-41/67
剑指offer(C++)-JZ70:矩形覆盖(算法-动态规划)
剑指offer(C++)-JZ70:矩形覆盖(算法-动态规划)
喔嚯霍,二叉树的遍历,先序,中序,后序原来这么简单(附代码)!!!
喔嚯霍,二叉树的遍历,先序,中序,后序原来这么简单(附代码)!!!
|
10月前
leetcode代码记录(二叉树的最大深度
leetcode代码记录(二叉树的最大深度
47 0
|
10月前
leetcode代码记录(翻转二叉树
leetcode代码记录(翻转二叉树
61 0
左旋转字符串(剑指offer 58-II)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
103 0
左旋转字符串 (剑指Offer58-II)
左旋转字符串 (剑指Offer58-II)
137 0
【day11】LeetCode(力扣)练习【1652.拆炸弹】【235. 二叉搜索树的最近公共祖先】【733. 图像渲染】
学习【1652.拆炸弹】【235. 二叉搜索树的最近公共祖先】【733. 图像渲染】。
118 0
【day11】LeetCode(力扣)练习【1652.拆炸弹】【235. 二叉搜索树的最近公共祖先】【733. 图像渲染】
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等