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
相关文章推荐
- 剑指offer——矩形覆盖问题
- 剑指offer(九,十) 变态跳台阶,矩形覆盖
- 剑指offer--(10) 矩形覆盖
- 《剑指offer》-矩形覆盖
- 剑指offer(矩形覆盖)
- 《剑指offer》矩形覆盖
- 剑指offer系列之九:矩形覆盖问题
- 剑指offer——第10题——覆盖矩形
- JavaScript版《剑指offer》刷题(13)链表中倒数第k个结点
- 《剑指offer》-矩形覆盖
- 剑指offer-矩形覆盖问题
- 《剑指Offer》递归和循环——矩形覆盖
- 剑指Offer:10 矩形覆盖
- 算法系列——矩形覆盖(剑指offer)
- 剑指offer:矩形覆盖
- 剑指offer矩形覆盖问题
- 《剑指Offer》读书笔记10:矩形覆盖
- 剑指offer---矩形覆盖
- JavaScript版《剑指offer》刷题(11)数值的整数次方
- 《剑指offer》10.斐波那契数列 / 跳台阶 / 变态跳台阶 / 矩形覆盖