剑指offer(十)矩形覆盖

来源:互联网 发布:2017网络市场专项行动 编辑:程序博客网 时间:2024/06/05 14:50
  • 题目

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

    • 先找规律,n<=0时,结果肯定返回0
    • n = 1时,返回值为1;n=2时,返回值为2;n=3时,返回值为3等等
    • 当为n时,还是按照之前的思想,化整为零,从一处着手
    • 现在看第一个1*1的位置,它有两种放置的方式,横着或者竖着放置矩形
    • 当它竖着放置的时候,剩余的就是f(n-1)种放置方法
    • 当它横着的时候,下面的两个也只能横着,剩余的就是f(n-2)种方式
    • 所以最终这也是一个斐波那契数列
  • 解题代码

public class Solution {    public int RectCover(int target) {        if(target <= 0) return 0;        if(target == 1) return 1;        if(target == 2) return 2;        int a = 1;        int b = 2;        int sum = 0;        for( int i = 3; i <= target; i++ )        {            sum = a + b;            a = b;            b = sum;        }        return sum;    }}
  • 总结
    • 细节入手,分析规律,善于归纳总结,才能抓住问题本质。