题干
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.1 阶 + 1 阶
2.2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.1 阶 + 1 阶 + 1 阶
2.1 阶 + 2 阶
3.2 阶 + 1 阶
题目分析
- 本题是一道简单难度的动态规划,与力扣的按摩师,打家劫舍比较相似
- 因为要求出有多少种方法可以爬到楼顶,所以状态设计为到第i阶台阶的方法数dp[i]
- 因为每次只能爬1阶或者2阶,所以dp[i]只能由dp[i - 1]和dp[i - 2]决定,dp[i] = dp[i - 1] + dp[i - 2],最后返回dp[n]即可
- 该算法从时间上分析,只是遍历了一遍dp数组,所以时间复杂度为O(n),空间上开辟了一个长度为n+1的数组,所以空间复杂度为O(n)
代码实现
class Solution {
public int climbStairs(int n) {
if(n == 0){
return 0;
}
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; ++i){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}