剑指offer-10 矩形覆盖
一、题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
二、解题步骤
1.解题思路
和青蛙跳台阶的原理类似,小矩形竖着放相当于跳一级台阶,横着放相当于跳两级台阶,那问题的就变成了一共有n个台阶,可以一次走两步,也可以一次走一步,问一共有多少种走法?
其实本质仍旧是斐波那契数列。
2.代码实现
2.1 递归方法实现
被覆盖的目标矩形的形状: 2*n
每次新增加的一列,(1)如果竖着放对应的情况与 target为 n-1 时相同;(2)如果横着放,对应的情况与 target 为 n-2 时相同。
public class Solution {
public int rectCover(int target) {
if (target < 1) {
return 0;
} else if (target == 1 || target == 2) {
return target;
} else {
return rectCover(target-1) + rectCover(target-2);
}
}
}
2.2 循环加和法
其实本质仍然是斐波那契数列的实现方法,第三项等于前两项的加和
Java实现
public class Solution {
public int rectCover(int target) {
if(target <= 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
int first = 1;
int second = 2;
int result = 0;
for(int i = 3; i <= target; i++){
result = first + second;
first = second;
second = result;
}
return result;
}
}
Python实现
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
#和跳台阶类似,小矩形竖着放相当于跳一级台阶,横着放相当于跳两级台阶,所以可以复用跳台阶的代码
#菲波那切数列本质
if number==0 or number ==1 or number ==2:
return number
First=1
Second=2
Third=0
for i in range(3,number+1):
Third=First+Second
#加完之后向后移动
First=Second
Second=Third
return Third
3.总结
此题本质上仍然是斐波那契数列,通过递归、加和等方法实现。