Java实现矩形覆盖

题目描述

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

不知道为什么,拿到这个题,我觉得好像似曾相识....

难道不是青蛙跳台阶的另一种说法?


分析题目:

首先,2*1或者是2*n,长为2是确定的。

如果横着放,那么长度2被覆盖了,宽度n-1

如果竖着放,长度2只被覆盖了一半,宽度n-2,所以只要是竖着放,必须是两个一起竖着放。

从覆盖的角度,也就是n逐渐减少的过程来看,这里的递推公式应该是:

f(n)=f(n-1)+f(n-2)

所以第一版我用的是递归,AC了。但是时间复杂度和空间复杂度都比较高。


换一个思路,把题目想象成,用小矩形拼凑出大矩形,就是n++的思路,

那么,

f(1)=1

f(2)=2

f(3)=f(2)+f(1)

f(4)=f(3)+f(2)

.....

f(n)=f(n-1)+f(n-2)

这样就可以用for循环来做了。

AC代码如下,23ms:

public class Solution {
    public int RectCover(int target) {
 		if (target <= 0) {  
            return 0;  
        }  
        if (target == 1) {  
            return 1;  
        }  
        if (target == 2) {  
            return 2;  
        }  
        
        
       // int sum=RectCover(target-1)+RectCover(target-2);
       // return sum;
         int first = 1;  
        int second = 2;  
        int third = 0;  
        for(int i = 3; i <= target; i++) {  
            third = first + second;  
            first = second;  
            second = third;  
        }  
        return third;  
        
        
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值