70.爬楼梯
70.爬楼梯
题目
假设你正在爬楼梯。需要 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1
这道题不问具体解,只求最优解,可以尝试使用动态规划看看。
这道题输入的是需要n阶你才能到达楼顶,输入的n是不确定的。
爬楼是一层一层爬,这里肯定是有递进关系的,先举例看看能不能有什么规律。
n=1时,有1种方法。
n=2时,有2种方法,可以一步爬两层,或者先爬一层再爬一层。
n=3时,有3种方法,先到还差1阶的位置+爬2层,或者先到还差2阶的位置+爬1层。差3阶的方法数 = 差1阶的方法数+差2阶的方法数
这样看看来是由规律的,后面的状态由前面的状态推出。
可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和
爬上 n-1 阶楼梯的方法数量。因为再爬1阶就能到第n阶
爬上 n-2 阶楼梯的方法数量,因为再爬2阶就能到第n阶
套上动态规划做题的步骤
1.确定dp数组以及下标的含义
i表示需要i阶到达楼顶
dp[i]表示爬到楼顶的方法数
2.确定递推公式
dp[i] = dp[i-1] + dp[i-2]
3.dp数组如何初始化
i=0时,表示此时已经在楼顶了,不需要再爬了,那么dp[1] = 0;(这个是没有意义的,只是为了下标对应)
i=1时,dp[1]=1;
i=2时,dp[2]=2;
4.确定遍历顺序
遍历顺序是从左到右
5.举例推导dp数组
当n=5时 1 2 3 5 8
代码
class Solution {
public int climbStairs(int n) {
if(n<3) return n;
int [] dp = new int [n+1];
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<n+1;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}