【剑指Offer】10、矩形覆盖

本文探讨了使用2x1小矩形无重叠覆盖2xn大矩形的方法总数问题,通过归纳和递归思路,提供了Java代码实现,并详细解释了递归公式f(n)=f(n-1)+f(n-2)的逻辑。

一、题目描述

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

二、代码

思路:归纳总结,最后发现是递归。

(1)当n=1,  2*1 ==>1种;
(2)当n=2,  2*2 ==>2种;
(3)当n=32*3 ==>3种;
(4)当n=4,  2*4 ==>5种;
……
……
……
5)当n=n,  2*n ==>f(n-1)+f(n-2).

解析:2*n放入2*1矩形时,填充方式有两种,竖着放和横着放。当竖着放时,此时剩下的格子为2*(n-1),那么对应的可能性为f(n-1);当横着放时,左边的2*2确定了,此时剩下的格子数量为2*(n-2),对应的可能性为f(n-2)。所以f(n) = f(n-1)+f(n-2)
选择过程

代码:

public class Solution {
    int sum = 0;
    public int RectCover(int target) {
        if(target<0){  // 加上,否则容易越界
            return 0;
        } else if(target==1){
            return 1;
        } else if(target==2){
            return 2;
        } else {
            sum = RectCover(target-1)+RectCover(target-2);
        }
        return sum;
    }
}

测试程序:

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

public class Main {

	public static void main(String[] args) {
		
		int  f;	
		Solution solu = new Solution();
		
		f = solu.RectCover(3);
		
		System.out.println(f);
	}
}

三、感受

代码好写,思路不易。

四、参考

1、参考 Follow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值