Andy Back-end Dev Engineer

剑指offer-矩形覆盖


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

解体思路

依旧是斐波那契数列 2n的大矩形,和n个21的小矩形 其中target*2为大矩阵的大小 有以下几种情形:

  1. ️target <= 0 大矩形为<= 2*0,直接return 1;
  2. ️target = 1大矩形为2*1,只有一种摆放方法,return1;
  3. ️target = 2 大矩形为2*2,有两种摆放方法,return2;
  4. ️target = n 分为两步考虑: 1) 第一次摆放一块 21的小矩阵,则摆放方法总共为f(target - 1) 2) 第一次摆放一块12的小矩阵,则摆放方法总共为f(target-2)

综上:f(n) = f(n-1) + f(n-2)

代码实现:

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

Comments

Content