【规律】跳台阶、变态跳台阶和矩形覆盖

1、跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

2、矩形覆盖

题目描述

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

这两个解法一致


public class Solution {
    /** 递归实现 **/
    public int RectCover(int target) {
        if(target == 0){
            return 0;
        }
        if(target == 1 || target == 2){
            return target;
        }
        
        return RectCover(target - 1) + RectCover(target - 2);
    }
    
    /** 非递归实现 **/
    public int RectCover(int target) {
        if(target == 0){
            return 0;
        }else if(target == 1 || target == 2){
            return target;
        }else{
            int a = 1;
            int b = 2;
            int c = 1;
            for(int i =3 ; i <=target; i++){
                c = a + b;
                a = b;
                b = c;
            }
             
            return c;
        }
    }
}

3、变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路解析

第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因为f(n-1)=f(n-2)+f(n-3)+...+f(1)

所以f(n)=2*f(n-1)

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 0){
            return 0;
        }
        
        if(target == 1){
            return 1;
        }
        
        int begin = 1;
        for(int i = 2; i<= target; i++){
            begin = begin << 1;
        }
        
        return begin;
        
    }
}

猜你喜欢

转载自blog.csdn.net/chenxuegui123/article/details/89224172