【剑指 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
思路分析:
解析原链接:
求解 类似于 有多少可能性,多少方法的题目 ,尝试观察是否存在 递推的性质,
即是 :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)
从第一个开始计算,循环计算到 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 ;
标签:力扣,10,台阶,示例,int,复杂度,Offer,II,跳上 来源: https://blog.csdn.net/Kefenggewu_/article/details/121691756