假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int climbStairs(int n) {
if(n<=2) return n;
int[] dp = new int[3];
dp[1] = 1;
dp[2] = 2;
int sum = 0;
for(int i = 3;i<=n;i++){
sum = dp[1]+ dp[2];
dp[1] = dp[2];
dp[2] = sum;
}
return sum;
}
}
这题和前面斐波那契数列有点像
首先确定dp数组的含义是设定第n个台阶是楼顶,有dp[n]种方法到楼顶。
dp[0]不设置数值,因为到第0阶根本不需要跳
dp[1]是一层,到一台阶只有一种方法:跳一台阶 所以dp[1] = 1
dp[2]是二层,到二台阶有两种方法:跳两台阶或者1+1 ,所以dp[2] = 2
dp[3]是三层,1+2 ,1+1+1,2+1 所以dp[3] =3
由此可见
dp[i] 可以是 dp[i-1] + 跳一个台阶 ,也可以是dp[i-2] + 跳两个台阶
所以dp[i] = dp[i-1]+dp[i-2]