剑指offer10_矩形覆盖_题解

矩形覆盖

题目描述

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

比如\(n=3\)时,\(2*3\)的矩形块有\(3\)种覆盖方法:

示例1

输入

4

返回值

5

分析

方案一:递推

n=1时,显然只有一种方法

img

n=2时,如图有2种方法

img

n=3,如图有3中方法

img

n=4,如图有4种方法。

img

涂掉最后一级矩阵的时候,可以选择使用横向完成,也可以使用竖向完成,横向涂剩下 \(n - 1\) 阶,竖向涂剩下 \(n - 2\) 阶,可以得出递推方程为

\[f(n)=f(n-1)+f(n-2)\tag{n>2} \]

\[f(1)=1,f(2)=2 \]

/**
时间复杂度:O(n)
空间复杂度:O(1)
**/
class Solution
{
public:
    int rectCover(int number) {
        if(number == 1 || number == 2){
            return number;
        }
        int a = 1, b = 2, c;
        for(int i = 3; i <= number; i++){
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
};
posted @ 2020-12-08 16:45  RiverCold  阅读(61)  评论(0编辑  收藏  举报