剑指offer 10矩形覆盖

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

java版本:

public class Solution {

    public  static void main(String[] args){
        long startTime=System.currentTimeMillis();
        System.out.println("第23项的结果是:"+RectCover(23));
        long endTime=System.currentTimeMillis();
        System.out.println("程序执行的时间:"+(endTime-startTime)+"ms");
    }
    /*递归*/
    /*public static int RectCover(int target){
        if(target<3){
            return target;
    }else{
            return RectCover(target-1)+RectCover(target-2);
        }
    }*/
    /*非递归*/
    public static int RectCover(int target){
        if(target<2){
            return target;
    }else{
            int a=1;
            int b=2;
            int c=0;
            for(int i=3;i<=target;i++){
                c=a+b;
                a=b;
                b=c;

            }
            return c;
        }
    }

}

js版本:

function rectCover(number)
{
    if(number<3){
        return number;
    }else{
        var a=1,b=2,c=0;
        for(var i=3;i<=number;i++){
            c=a+b;
            a=b;
            b=c;
        }
        return c;
    }
}

总结这道题用的也是斐波那契数列,思想和前几道题一致,不明白的同学可以翻翻我之前做过的题。故在此就不做详述,还是建议大家不用递归,时间复杂度较高。

原文地址:https://www.cnblogs.com/yyfyl/p/9457923.html

时间: 2024-10-11 13:56:07

剑指offer 10矩形覆盖的相关文章

剑指OFFER之矩形覆盖(九度OJ1390)

题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70),其中n为偶数. 输出: 对应每个测试案例, 输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数. 样例输入: 4 样例输出: 5 解题思路: 观察题目中的矩形,2*n的,是个长条形.本来脑中想象的是复杂的华容道,但是既然只是简单的长条形,那么

剑指Offer:矩形覆盖【N1】

剑指Offer:矩形覆盖[N1] 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题目思考 我们先把2*8的覆盖方法记为f(8),用一个2*1的小矩形去覆盖大矩形的最右边时有两种选择,横着放或者竖着放, 此时左边的空间为f(6)或f(7),那么f(8)的放置结果为f(6)[右边横着放]+f(7)[右边竖着放] 找规律 f(n)=f(n-1)+f(n-2),斐波那契数列 Java题解 public clas

【剑指Offer】矩形覆盖

问题描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形. 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形, 总共有多少种方法? 解题思路 n=1 - 只有横放一个矩形一种解决办法 n=2 - 有横放一个矩形,竖放两个矩形两种解决办法 n=3 - n=2的基础上加1个横向,n=1的基础上加2个竖向 n=4 - n=3的基础上加1个横向,n=2的基础上加2个竖向 · · · n=n - n = f(n-1) + f(n-2) 斐波那契数列变种..... 代码实现 class Solu

剑指offer:矩形覆盖

题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: """ 如果number == 1,那么只有1种 即 f(1) == 1 f(2) == 2 ... f(n) = f(n-1) + f(n-2) 因此跟斐波那契数列是一样的,可用递归也可用循环求解 """ def rectCover(self, number): if number

剑指offer (10) 二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数. 我们可能很快写下如下代码: 1 int NumOf1InBinary(int n) 2 { 3 int count = 0; 4 while (n != 0) { 5 if (n & 1 ) { 6 ++count; 7 } 8 n >> 1; // bug!!! 9 } 10 return count; 11 } 第8行存在bug. 首先C/C++中数有无符号数和有符号数两种(我一直认为无符号数是个蛋疼的存在,滋生大量的bug) 左

【Java】 剑指offer(10) 旋转数组的最小数字

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1. 思路 数组在一定程度上是排序的,很容易分析出:可以采用二分法来寻找最小数字. 但是这里面有一些陷阱: 1.递增排序数组的本身是自己的旋转,则最小数字

剑指offer 10:矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? public class Solution { public int RectCover(int n) { int x = 1, y = 2; if(n <= 2) return n; for(int i = 3; i <= n; i++){ y += x; x = y - x; } return y; } } 原文地址:https://www.cnblo

[剑指offer] 10. 旋转数组的最小数字

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过摆前几个推算出规律 1 时候就是 | 2 时候就是 | | 和 -- 摆n的时候就是两种情况,一种是先摆1格,则有dp[n-1]种方法 另一种是先2格,则有dp[n-2]种方法. 于是推出dp[n]=d[n-1]+dp[n-2] class Solution { public: int rectCo

剑指offer(1~10)题解

剑指offer(1~10) 二维数组中的查找 源代码 class Solution { public: bool Find(int target, vector<vector<int> > array) { for(int i = 0 ; i < array.size() ; i ++){ for( int j = array[i].size() - 1 ; j >= 0 ; j--){ if( array[i][j] == target){ return true;