每日一道算法题——矩形覆盖

来源:互联网 发布:linux 安装jdk gz文件 编辑:程序博客网 时间:2024/06/05 11:47

题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
测试用例:
0 1 2 3 4 … 10
对应输出应该为:
0 1 2 3 5 …

分析:
此题依旧是斐波那契数列。这里只贴出代码,具体的相关分析请参考另一篇博客:Dawson的博客

1.简单的递归:

public class Test1 {    public int RectCover(int target) {        if (target <=2) {            return target;        }else        return RectCover(target - 1)+RectCover(target-2);    }}

2.使用循环:

public class Test1 {    public int RectCover(int target) {        int Fn1 = 2;//相当于F(n-1)        int Fn2 = 1;//相当于F(n-2)        int result = 0;        if (target <=2)            return target;        for (int i = 3; i <= target; i++) {            result = Fn1 + Fn2;            Fn2 = Fn1;            Fn1 = result;        }        return result;    }}

运行测试:

第一种:
运行时间:489ms
占用内存:19184k
第二种:
运行时间:16ms
占用内存:21320k

总结:
好多算法题的原型其实都是统一的,只要抓住核心的算法,稍加变通或是针对性地优化,都能拿出还可以的答案的。问题是如何把问题抽象化、提取出来。

原创粉丝点击