题目链接:https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
1. 题目介绍(10- II. 青蛙跳台阶问题)
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
【测试用例】:
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
示例 3:
输入:n = 0
输出:1
【条件约束】:
提示:
- 0 <= n <= 100
2. 题解
2.1 循环求余法 – O(n)
时间复杂度O(n),空间复杂度O(1)
class Solution {
public int numWays(int n) {
int a = 1, b = 1, sum;
for(int i = 0; i < n; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}
2.2 动态规划 – O(n)
时间复杂度O(n),空间复杂度O(n)
动态规划法在求解子问题时,会保存该子问题的解,后面的子问题求解时,可以直接拿来计算,这无疑是要比递归的效率高上很多。
class Solution {
static final int MOD = 1000000007;
public int numWays(int n) {
if (n <= 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
}
return dp[n];
}
}
3. 变形:变态版跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
参考上述思路: 此时青蛙跳上第n级台阶的方法数:
f(n)=f(n-1)+f(n-2)+f(n-3)+···+f(2)+f(1)+1[1是直接一次跳到n级]
f(n-1)=f(n-2)+f(n-3)+f(n-4)+···+f(2)+f(1)+1,可得:
f(n)=2*f(n-1),所以这是一个等比数列, 可得f(n)=2^(n-1)
// 非递归实现
public static int JumpFloorII(int target) {
if(target == 0) return 0;
if(target == 1) return 1;
int a = 1;
while (target > 1){
a = 2*a;
target--;
}
return a;
}
// 递归实现
public static int JFII(int target){
if(target == 0) return 0;
if(target == 1) return 1;
return 2*JumpFloorII(target-1);
}
4. 参考资料
[1] 【LeetCode】No.70. Climbing Stairs – Java Version – 相同题目
[2] 【LeetCode】剑指 Offer 10- I. 斐波那契数列 p74 – Java Version – 相同题目
[3] 【LeetCode】剑指 Offer 10- Ⅲ. 矩形覆盖 p79 – Java Version – 相同题目
[4] 面试题10- II. 青蛙跳台阶问题(动态规划,清晰图解)-- 部分解题思路和图片来源