剑指offer-矩形覆盖

问题

题目:[矩形覆盖]

思路

先说我自己想的思路,主要分两种情形:
1. 全部竖着放,这是一种。
2. 至少有一种横着放,那么当N是偶数的情形,n= N/2;此时,所有的情况是 C1n+C2n+...Cnn ,问题是奇数的情形,这种排列数我没想清楚,这个题最终还是栽在了数学上。还是,上来先想,锻炼思维是最重要的。

代码(未AC)

class Solution {
public:
    int rectCover(int number) {
        if(number < 1) return 0;
        else if(1==number) return 1;
        else{
            int ans  = 1;
            if(0== number%2){
                int max = number/2;
                for(int i = 1; i <= max; ++i){
                    ans += C(max, i);
                }
            }
            else{
                // 奇数情形的组合数我没有想清楚
                // ...
            }
            return ans;
        }
    }
private:
    int C(int n, int k){
        return 1.0/fact(n-k)*fact(n);
    }
    int fact(int n){
        if(n < 0) return -1;
        else if( 0==n || 1==n ) return 1;
        else{
            int ret = 1;
            for(int i = 2; i <= n; ++i){
                ret *= i;
            }
            return ret;
        }

    }
};

思路1

参照了这篇链接[ 剑指offer: 矩形覆盖(循环与递归)]
直接上图吧,比较情形。
这里写图片描述
(该图来自于上文链接,并非原创,特此说明)

假设N=3,
一开始有两种选择,要么横着放,要么竖着放。
这不和上楼梯一样,一次迈一步,或者一次迈两步。
所以,上图可以理解为从右向左迈步子的时候,最后一次,要么迈一步,要么迈两步。
那么有, f(n)=f(n1)+f(n2)

代码1

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

            long f1 = 1;
            long f2 = 2;
            for(int i = 3; i <= number; ++i){
                long t = f1 + f2;
                f1 = f2;
                f2 = t;
            }
            return f2;
        }


    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值