剑指Offer面试题:13.矩形覆盖
一、题目
————————————————
我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2n 的大矩形,总共有多少种方法?
————————————————
————————————————
二、思路
————————————————
当 n 为 1 时,只有一种覆盖方法:
————————————————
当 n 为 2 时,有两种覆盖方法:
————————————————
要覆盖 2n 的大矩形,可以先覆盖 21 的矩形,再覆盖 2(n-1) 的矩形;或者先覆盖 22 的矩形,再覆盖 2(n-2) 的矩形。而覆盖 2(n-1) 和 2(n-2) 的矩形可以看成子问题。该问题的递推公式如下:
————————————————
三、解决问题
————————————————
package swordoffer;
/**
* @author LQ
* @version 1.0
* @date 2020-03-15 20:36
*/
/**
* 我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。
* 请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法?
*/
public class Solution13 {
public static void main(String[] args) {
Solution13 demo = new Solution13();
System.out.println(demo.RectCover(1));
System.out.println(demo.RectCover(2));
System.out.println(demo.RectCover(8));
System.out.println(demo.RectCover(0));
}
public int RectCover(int target) {
if(target < 1){
//当target<0,不符合约束条件
throw new RuntimeException("下标错误,应从1开始!");
}
if(target <= 2){//当target=1,target=2
return target;
}
int pre2 = 1, pre1 = 2;
int result = 0;
for (int i = 3; i <= target; i++) {
result = pre2 + pre1;//f(n)= f(n-2) + f(n-1) 3=1+2
pre2 = pre1;//1=2
pre1 = result;//2=3
}
return result;
}
}
————————————————
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。
Java基础 文章被收录于专栏
建立本人的Java基础技术栈积累库
