剑指offer之个人刷题历程记录

心情大好还是要刷题!

矩形覆盖

题目描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
知识点:
递归与循环
解题思路:
一拿到这个题,第一反应就是找规律,因为这种不找规律肯定特别麻烦,于是就开始先写出前几个矩形所能组成大矩形的方法:
当n=1时,只能覆盖一个2
1的大矩形,只有1种方法;
当n=2时,就有2个21的小矩形,可以覆盖成22的大矩形,共有2种方法;
当n=3时,就有3个21的小矩形,可以覆盖成23的大矩形,共3种方法;
当n=4时,就有4个21的小矩形,可以覆盖成24的大矩形,共5种方法;
当n=5时,…共有8种方法。
其实可以看出,这就是一个斐波那契数列,1,2,3,5,8,…
其实我的思考方式很笨,就是画几个图然后总结规律,看了人家的考虑方式自愧不如。
注意点:
这个代码和之前的代码一模一样,没什么改动,直接能调通。然后也没有用递归。就是在画方法的时候,有时候忽略掉,横竖的差异,认为=和||是一样的,简直是蠢。

具体代码:

public class Solution {
    public int RectCover(int target) {
         if(target<=0){
           return 0;
       }
        if(target==1){
            return 1;
        }
        if(target==2){
            return 2;
        }
        int[] array=new int[target];
        int i;
        array[0]=1;
        array[1]=2;
        for(i=2;i<target;i++)
        {
            array[i]=array[i-1]+array[i-2];
        }
        return array[target-1];
    }
}

总结:
讨论区一个大神更为详细的分析:
参考链接:
https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
来源:牛客网

public class Solution {
    public int RectCover(int target) {
        if (target < 1) {
            return 0;
        } else if (target == 1 || target == 2) {
            return target;
        } else {
            return RectCover(target-1) + RectCover(target-2);
        }
    }
}

走过的弯路:
开始只是简单地将 n 分成奇、偶讨论,并将 22 作为基本单元。测试后通不过,代码就不贴出来献丑了。
思路分析:
痛定思痛,还是不能够贪小便宜。用归纳法归纳如下,
(1)当 n < 1时,显然不需要用2
1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。
在这里插入图片描述

(3)当 n = 2时,存在两种情况。
在这里插入图片描述
(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。
在这里插入图片描述

… 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。
可以明确,n 时必定有 n-1时原来方式与21的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。
(4)如果我们现在归纳 n = 4,应该是什么形式?
4.1)保持原来n = 3时内容,并扩展一个 2
1 方块,形式分别为 “| | | |”、“= | |”、“| = |”
4.2)新增加的21 方块与临近的21方块组成 22结构,然后可以变形成 “=”。于是 n = 4在原来n = 3基础上增加了"| | ="、“= =”。
再自己看看这多出来的两种形式,是不是只比n = 2多了“=”。其实这就是关键点所在…因为,只要2
1或12有相同的两个时,就会组成22形式,于是就又可以变形了。
所以,自然而然可以得出规律: f(n) = f(n-1) + f(n-2), (n > 2)。

如果看了这一套理论还存在疑惑。可以尝试将题目改成13方块覆盖3n、14方块覆盖4n。
相应的结论应该是:
(1)1 * 3方块 覆 盖3n区域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 4 方块 覆 盖4n区域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的结论,如果用1
m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值