Java实现矩形覆盖

来源:互联网 发布:淘宝9.9元特价专区在哪 编辑:程序博客网 时间:2024/06/08 11:41

题目描述

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

不知道为什么,拿到这个题,我觉得好像似曾相识....

难道不是青蛙跳台阶的另一种说法?


分析题目:

首先,2*1或者是2*n,长为2是确定的。

如果横着放,那么长度2被覆盖了,宽度n-1

如果竖着放,长度2只被覆盖了一半,宽度n-2,所以只要是竖着放,必须是两个一起竖着放。

从覆盖的角度,也就是n逐渐减少的过程来看,这里的递推公式应该是:

f(n)=f(n-1)+f(n-2)

所以第一版我用的是递归,AC了。但是时间复杂度和空间复杂度都比较高。


换一个思路,把题目想象成,用小矩形拼凑出大矩形,就是n++的思路,

那么,

f(1)=1

f(2)=2

f(3)=f(2)+f(1)

f(4)=f(3)+f(2)

.....

f(n)=f(n-1)+f(n-2)

这样就可以用for循环来做了。

AC代码如下,23ms:

public class Solution {    public int RectCover(int target) { if (target <= 0) {              return 0;          }          if (target == 1) {              return 1;          }          if (target == 2) {              return 2;          }                         // int sum=RectCover(target-1)+RectCover(target-2);       // return sum;         int first = 1;          int second = 2;          int third = 0;          for(int i = 3; i <= target; i++) {              third = first + second;              first = second;              second = third;          }          return third;                      }}






原创粉丝点击