剑指offer -矩形覆盖(java实现)

题目描述:

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

思路分析:
其实这题就是跳台阶的变种题,其核心还是斐波那契数列。
在这里插入图片描述

如上图所示:
当n=1时,只有一种方式。
当n=2时,存在2种摆放方式。
当n>=3时,这时候需要考虑先竖着摆放还是先横着摆放的问题。
当先竖着摆放时,还剩下(n-1)*2的宽度,所以有f(n-1)种摆放方式。
当先横着摆放时,还剩下(n-2)*2的宽度,所以有f(n-2)种摆放方式。
所以f(n) = f(n-1)+f(n-2);即追根溯源还是斐波那契数列的问题。

代码如下:

方法1:用递归的方法实现。

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

方法2:

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

猜你喜欢

转载自blog.csdn.net/justlikeu777/article/details/84348242