题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解题思路:
这道题其实就是一个斐波那契数列。
比如F(4)=F(3)+F(2),如下图所示:
F(1)=1,F(2)=2,F(3)=F(1)+F(2)=3就这样递归下去。
/**
* 矩形覆盖
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int i = solution.RectCover(5);
System.out.println(i);
}
public int RectCover(int target) {
if (target == 0) {
return 0;
}
if (target == 1) {
return 1;
}
if (target == 2) {
return 2;
}
int i1 = RectCover(target - 1);
int i2 = RectCover(target - 2);
return i1 + i2;
}
}
如果这样写的话,会有很多次递归运算,是会有性能问题的。
所以我们应该把计算的结果缓存起来,那就快多了。实测下来,从650ms下降到24毫秒。
import java.util.HashMap;
public class Solution {
HashMap<Integer, Integer> cache = new HashMap<>();
public int RectCover(int target) {
if (target == 0) {
return 0;
}
Integer cacheInt = cache.get(target);
if (cacheInt != null) {
return cacheInt;
}
if (target == 1) {
return 1;
}
if (target == 2) {
return 2;
}
int i1 = RectCover(target - 1);
int i2 = RectCover(target - 2);
int count = i1 + i2;
cache.put(target, count);
return count;
}
}