剑指offer-10 矩形覆盖

 剑指offer-10 矩形覆盖

一、题目描述

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

比如n=3时,2*3的矩形块有3种覆盖方法:


二、解题步骤


1.解题思路

和青蛙跳台阶的原理类似,小矩形竖着放相当于跳一级台阶,横着放相当于跳两级台阶,那问题的就变成了一共有n个台阶,可以一次走两步,也可以一次走一步,问一共有多少种走法?

其实本质仍旧是斐波那契数列。


2.代码实现

2.1 递归方法实现

  被覆盖的目标矩形的形状: 2*n
  每次新增加的一列,(1)如果竖着放对应的情况与 target为 n-1 时相同;(2)如果横着放,对应的情况与 target 为 n-2 时相同。

public class Solution {
    public int rectCover(int target) {
        if (target < 1) {
            return 0;
        } else if (target == 1 || target == 2) {
            return target;
        } else {
            return rectCover(target-1) + rectCover(target-2);
        }
    }
}

2.2 循环加和法

其实本质仍然是斐波那契数列的实现方法,第三项等于前两项的加和

Java实现

  public class Solution {
    public int rectCover(int target) {
		if(target <= 0){
            return 0;
        }
        if(target == 1){
            return 1;
        }
        if(target == 2){
            return 2;
        }
        int first = 1;
        int second = 2;
        int result = 0;
        for(int i = 3; i <= target; i++){
            result = first + second;
            first = second;
            second = result;
        }
        return result;
    }
}

Python实现 

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        #和跳台阶类似,小矩形竖着放相当于跳一级台阶,横着放相当于跳两级台阶,所以可以复用跳台阶的代码
        #菲波那切数列本质
        if number==0 or number ==1 or number ==2:
            return number
        First=1
        Second=2
        Third=0
        for i in range(3,number+1):
            Third=First+Second
            #加完之后向后移动
            First=Second
            Second=Third 
        return Third
            


3.总结

此题本质上仍然是斐波那契数列,通过递归、加和等方法实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值