Go&Java算法之青蛙跳台阶问题

204 阅读2分钟

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

青蛙跳台阶问题

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2

输出:2

示例 2:

输入:n = 7

输出:21

示例 3:

输入:n = 0

输出:1

提示:

0 <= n <= 100

题解

算法一:动态规划(Java)

此类求 多少种可能性 的题目一般都有 递推性质 ,即 f(n) 和 f(n-1)…f(1)之间是有联系的。

设跳上 n 级台阶有 f(n) 种跳法。在所有跳法中,青蛙的最后一步只有两种情况: 跳上 1 级或 2 级台阶。

当为 1 级台阶: 剩 n-1 个台阶,此情况共有 f(n-1) 种跳法;

当为 2 级台阶: 剩 n-2 个台阶,此情况共有 f(n-2) 种跳法。

f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2) ,以上递推性质为斐波那契数列。本题可转化为 求斐波那契数列第 n 项的值 ,与 面试题10- I. 斐波那契数列 等价,唯一的不同在于起始数字不同。

青蛙跳台阶问题: f(0)=1 , f(1)=1 , f(2)=2 ;

斐波那契数列问题: f(0)=0 , f(1)=1 , f(2)=1 。

class Solution {

    public int numWays(int n) {
        if(n <= 1) {
            return 1;
        }
        int a = 1;
        int b = 1;
        int sum = 0;
        for(int i = 2; i <= n; i++) {
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return sum;
    }
}

时间复杂度:O(N)

空间复杂度:O(1)

算法一:动态规划(Go)

思路同上

func numWays(n int) int {
    if n==0{
        return 1
    }
    if n==2||n==1{
        return n
    }
    dp:=make([]int,n+1)
    dp[0]=1
    dp[1]=1
    for i:=2;i<=n;i++{
        dp[i]=(dp[i-1]+dp[i-2])%1000000007
    }
    return dp[n]
}

时间复杂度:O(N)

空间复杂度:O(1)