1, 题目描述
2. 算法思路
此题使用动态规划,分析后会得知,原理就是斐波那契,同上一篇的内容一致
首先分析最后一步的情况,青蛙有两种可能:跳1级 或 跳2级
- 跳1级,就剩n - 1 台阶,有f(n -1)种跳法
- 跳2级,就剩n - 2 台阶,有f(n -2)种跳法
- 那么f(n) = f(n - 1) + f(n - 2) ---------果然是斐波那契,那接下来就好办了
不过,本题与斐波那契存在唯一的差异:就是初始状态不同
- 斐波那契: f(0) = 0, f(1) = 1, f(2) = 1;
- 青蛙跳跳: f(0) = 1, f(1) = 1, f(2) = 2;--------f(0)没有实际含义,主要是为了满足方程,
动态规划解析:
- 状态定义:设dp为一维数组,dp[ i ]代表斐波那契的第i个数字
- 转移方程:dp[ i + 2] = dp[ i + 1] + dp[ i ],
- 初始状态:dp[0] = 1 ,dp[1] = 1, dp[2] = 2;
- 返回值:dp[i]
空间复杂度的优化:由于本题,在状态转移的过程中,只需要使用到dp[ i + 2] = dp[ i + 1] + dp[ i ],三个数,因此无需使用数组进行存储,可以将空间复杂度从O(n) 降低到 O(1);
3. 代码
class Solution {
public int numWays(int n) {
int a = 1;
int b = 1;
int sum = 1;
for(int i = 0; i < n-1; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return sum;
}
}
4. 测试结果