剑指offer10:2*1的小矩形横着或者竖着去覆盖2*n的大矩形,总共有多少种方法?...

1. 题目描述

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

2.思路和方法

  思路:(下面说到的x*y的矩形,x是宽,y是长,固定一下方便理解)假设一个2×n的矩形,那么放第一个小矩形有两种放法:放2×1的或者放1×2的,如果是放1×2的意味着在它的下面也只能放一个1×2的,组成一个2×2正方形。那么我们就可以分为两种结构,第一种是2×1的矩形,第二种是2×2的正方形。宽都是2不用考虑,长有1和2两种选择,那么可以将问题转换为:长为n的线段由长为1和长为2的线段组成,共有多少种组成方法

  长为n的线段组成方法=(第一步放长为1后剩下的线段的组成方法)+(第一步放长为2后剩下的线段的组成方法),即 f(n)=f(n-1)+f(n-2);1,2,3,5,8 …。就是一个类似斐波那契数列

3.C++核心代码

3.1 非递归方法
 1 class Solution {
 2 public:
 3     int rectCover(int number) {
 4         if(number<=2)
 5             return number;
 6         int f1 = 1;
 7         int f2 = 2;
 8         int result = 0;
 9         for(int i = 3; i <= number; i++){
10             result = f1 + f2;
11             f1 = f2;
12             f2 = result;
13         }
14         return result;
15     }
16 };
View Code
3.2 递归方法

递归代码量少,但是时间复杂度高。对于现在存储空间很大的环境下,应该节约时间。

1 class Solution {
2 public:
3     int rectCover(int number) {
4         if(number<=3)
5             return number;
6         return rectCover(number-2)+rectCover(number-1);
7     }
8 };
View Code

参考资料

https://blog.csdn.net/JMasker/article/details/86771720

转载于:https://www.cnblogs.com/wxwhnu/p/11407400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值