【剑指 Offer 10- II. 青蛙跳台阶问题】

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof

问题描述:

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

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

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

示例 3:

输入:n = 0
输出:1

提示:

  • 0 <= n <= 100

思路分析:

解析原链接:

1、力扣

2、力扣

求解  类似于  有多少可能性,多少方法的题目  ,尝试观察是否存在 递推的性质

即是 :f(n) 与 f(n-1)、f(n-2)、f(n-3)......f(1)  之间是否存在关联。

假设:跳上n 级台阶对应的跳法为 f(n):

 f(0) =1;

 f(1) =1;

 f(2) =2;

 f(3) =3;

 f(4) =5;

... ...

  当  n>1 时候,存在: f(n) = f(n-1) + f(n-2) ;

这与【剑指 Offer 10- I. 斐波那契数列】_是小武呀 -CSDN博客 情况相同,只是初始的数值不同,同样由动态规划思想,结合递推公式进行解题。

c++ 代码:

class Solution {
public:
    int numWays(int n) {
        int MOD =1000000007;
        if (n<=1){
            return 1;
        }
        int a= 1,b= 2;
        int temp;
        for(int i=2;i<n;++i){
            temp = (a+b);
            a = b;
            b = temp;
            b = b % MOD;
        } 
        return b;

    }
};

复杂度分析:

  • 时间复杂度:O(N)

                从第一个开始计算,循环计算到  得到了结果。

  • 空间复杂度:O(1)

        由于F(n) 只和 F(n−1) 与 F(n−2) 有关,因此可以使用「滚动数组思想」把空间复杂度优化成 O(1)。

python 代码:

class Solution:
    def numWays(self, n: int) -> int:
        a,b =1,1;
        for _ in range(n):
            a,b = b,a+b;

        return a % 1000000007 ;

Guess you like

Origin blog.csdn.net/Kefenggewu_/article/details/121691756