剑指Offer(十):矩形覆盖[递归循环]

牛客网刷题笔记记录。参考自:https://cuijiahua.com/blog/2017/11/basis_9.html

一.题目

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

二.思路分析

以2x8的矩形为例。示意图如下:

剑指Offer(十):矩形覆盖

我们先把2x8的覆盖方法记为f(n)。用第一个1x2小矩阵覆盖大矩形的最左边时有两个选择,竖着放或者横着放。当竖着放的时候,右边还剩下2x(n-1)的区域,这种情况下的覆盖方法记为f(n-1)。接下来考虑横着放的情况。当1x2的小矩形横着放在左上角的时候,左下角和横着放一个1x2的小矩形,而在右边还剩下2x(n-2)的区域,这种情况下的覆盖方法记为f(n-2)。因此f(n)=f(n-1)+f(n-2)。此时我们可以看出,这仍然是斐波那契数列

三.编程实现

class Solution {
public:
    int rectCover(int number) {
        if(number<=0)
        {
            return 0;
        }
         if(number<=2)
          {
              return number;
          }

        int num1=1,num2=2,result;
        for(int i=3;i<=number;i++)
        {
            result=num1+num2;
            num1=num2;
            num2=result;
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_39568744/article/details/88718138