剑指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基础技术栈积累库

全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务