解题思路:动态规划
动态规划三大步:
- 定义状态转移方程
- 给定方程初始值
- 递推实现
首先,定义dp数组;dp[i] 表示 跳上第i级台阶共有多少种跳法
状态转移方程:
跳上第i级台阶的跳法有两种情况:
- 跳到第
i - 1级台阶后再跳1级台阶 - 跳到第
i - 2级台阶后再跳2级台阶
所以,可以确定状态转移方程为:
dp[i] = dp[i - 1] + dp[i - 2]
确定初始值:
dp[0] = 1dp[1] = 1
代码
Java
class Solution {public int numWays(int n) {// 动态规划// dp[i] 表示 跳上第i级台阶共有多少种跳法// 状态转移方程:// dp[i] = dp[i - 1] + dp[i - 2]// dp初始值:// dp[0] = 1// dp[1] = 1 跳上第1级台阶只有一种跳法// dp[2] = 2 跳上第2级台阶有两种跳法:1. 每次跳1级;2. 直接跳2级if(n == 0){return 1;}if(n == 1){return 1;}int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for(int i = 2; i < n + 1; i++){dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;}return dp[n];}}
复杂度分析
- 时间复杂度:O(N)
通过动态规划的递推计算性质,可以知道时间复杂度为:O(N)
- 空间复杂度:
需要开辟 dp 数组,占用的额外空间为:O(N)
