题目描述
// 10.2. 青蛙跳台阶问题
// 力扣
// 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一
// 个 n 级的台阶总共有多少种跳法。
// 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008
// ,请返回 1。
// 牛客
// 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的
// 台阶总共有多少种跳法(先后次序不同算不同的结果)。
题解
// 实际上跟斐波那契数列是一个意思,青蛙要么跳1步,f(1)=1
// ,要么跳2步,f(2)=2
// 如果是台阶n阶,计算所有的跳法,
// 首先青蛙跳第一步的时候存在跳1阶和跳2阶两种情况
// 跳1阶,还剩下n-1阶,那么就是f(n-1)种跳法。
// 跳2阶,还剩下n-2阶,那么就是f(n-2)种跳法。
// 所有情况加起来,就是最终n阶台阶跳法,其实就是f(n)=f(n-1)+f(n-2)。
// 其实和斐波那契数列一样的算法。
// 牛客
// 暴力递归解,不可取
// 运行时间:317ms
// 占用内存:9584k
public class Solution {
public int JumpFloor(int target) {
if (target < 3)
return target;
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
// 动态规划
// 运行时间:9ms
// 占用内存:9688k
public class Solution {
public int JumpFloor(int target) {
if (target < 3)
return target;
int prev1 = 1, prev2 = 2;
int f = 0;
for (int i = 2; i < target; i++) {
f = prev1 + prev2;
prev1 = prev2;
prev2 = f;
}
return f;
}
}
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.4 MB, 在所有 Java 提交中击败了61.21%的用户
class Solution {
public int numWays(int n) {
if (n == 0)
return 1;
if (n < 3)
return n;
int prev1 = 1, prev2 = 2;
int f = 0;
for (int i = 2; i < n; i++) {
f = (prev1 + prev2) % 1000000007; // 根据数值要求做修改
prev1 = prev2;
prev2 = f;
}
return f;
}
}