您的位置:首页 > Web前端 > JavaScript

JavaScript版《剑指offer》刷题(9)矩形覆盖

2019-06-12 19:25 253 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014465934/article/details/91599932

1.题目描述

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

2.题目分析

1.先上图:
  

2*1
的大矩形和
2*n
的小矩形:


2. 第一次覆盖有两种情况:
  
横着覆盖:


竖着覆盖:



3. 由此可得:

当第一次横着覆盖时,覆盖方法为f(n-2),配合上图理解;
当第一次竖着覆盖时,覆盖方法为f(n-1),配合上图理解;
因此f(n)=f(n-1)+f(n-2);
当n=1时,只有1种覆盖方法,当n=2时,有2种覆盖方法。
此题最终得出的仍然是一个斐波那契数列。
n=1, f(n)=1
n=2, f(n)=2
n>2,且为整数, f(n)=f(n-1)+f(n-2)

当然也可以逆向思维

应为可以横着放或竖着放,多以f(n)可以是2*(n-1)的矩形加一个竖着放的21的矩形或2(n-2)的矩形加2横着放的,即f(n)=f(n-1)+f(n-2),当到了最后,f(1)=1,f(2)=2。

3.代码

//非递归循环
function jumpFloor(number)
{
if (number<0){
return -1;
}else if(number <=2){
return number
}
var arr = [];
arr[0] = 1;
arr[1] = 2;
for(var i = 2; i < number; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[number-1];

//动态规划
function rectCover(number) {
// write code here
if (number === 0) return 0;
let f = 1,
g = 2;
while (--number) {
g += f;
f = g - f;
}
return f;
}

参考文章:
https://www.cnblogs.com/echovic/p/6430666.html
https://www.geek-share.com/detail/2719402163.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: