(剑指offer) 矩形覆盖

题目描述

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

(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。

(3)当 n = 2时,存在两种情况。

(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。

... 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。
可以明确,n 时必定有 n-1时原来方式与2*1的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。
n = 1时, f(n) = 1;
n = 2时, f(n) = 2;
n > 2时,f(n) = f(n - 1) + f(n - 2);
很明确还是斐波那契数列的规律
只不过我们不用递归来做,用迭代效率更高
function rectCover(number){
    if(number == 0 || number == 1 || number == 2){
        return number
    }
    let current
    let re1 = 2
    let re2 = 1
    for(let i = 3; i<= number; i++) {
        current = re1 + re2
        re2 = re1
        re1 = current
    }
    return current
}

 

 

posted @ 2020-03-19 11:33  leahtao  阅读(80)  评论(0编辑  收藏  举报