剑指OFFER-(变态)跳台阶(Java)

1. 跳台阶

1.1 题目描述

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

1.2 示例1

输入

1

返回值

1

1.3 示例2

输入

4

返回值

5

1.4 核心代码实现

public class Solution {
    
    
    public int JumpFloor(int target) {
    
    
        /*递归:时间复杂度太大
        if(target <= 1) return 1;
        return JumpFloor(target - 1) + JumpFloor(target - 2);
        */
        
        /*设置新变量
        if(target <= 1) return target;
        
        int a = 1, b = 1, counts = 0;
        for(int i = 2; i <= target; i++){
            counts = a + b;
            a = b;
            b = counts;
        }
        return counts;
        */
        
        //开辟新空间
        int[] arr = new int[target + 1];
        arr[0] = arr[1] = 1;
        for(int i = 2; i <= target; i++){
    
    
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[target];
    }
}

2. 变态跳台阶

2.1 题目描述

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

2.2 示例1

输入

3

返回值

4

2.3 核心代码实现

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

3. 矩形覆盖

3.1 题目描述

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?比如n=3时,23的矩形块有3种覆盖方法:
在这里插入图片描述

3.2 示例1

输入

4

返回值

5

3.3 核心代码实现

public class Solution {
    
    
    public int rectCover(int target) {
    
    
        /*递归
        if(target <= 2) return target;
        return rectCover(target - 1) + rectCover(target - 2);
        */
        
        /*借助变量
        if(target <= 1) return target;
        int a = 1, b = 1, counts = 0;
        for(int i = 2; i <= target; i++){
            counts = a + b;
            a = b;
            b = counts;
        }
        return counts;
        */
        
        //借助数组
        if(target <= 1) return target;
        int[] arr = new int[target + 1];
        arr[0] = arr[1] = 1;
        for(int i = 2; i < arr.length; i++){
    
    
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[target];

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_48440312/article/details/109765000