一【题目类别】
- 动态规划
二【题目难度】
- 简单
三【题目编号】
- 70.爬楼梯
四【题目描述】
- 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
- 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
五【题目示例】
-
示例 1:
- 输入:n = 2
- 输出:2
- 解释:有两种方法可以爬到楼顶。
- ① 1 阶 + 1 阶
- ② 2 阶
-
示例 2:
- 输入:n = 3
- 输出:3
- 解释:有三种方法可以爬到楼顶。
- ① 1 阶 + 1 阶 + 1 阶
- ② 1 阶 + 2 阶
- ③ 2 阶 + 1 阶
六【题目提示】
- 1 <= n <= 45
七【解题思路】
- 利用动态规划的思想
- 首先如果台阶个数为1只能有一种走法,如果台阶个数为2只能有两种走法
- 那么如果台阶个数为3,要么从第2层台阶走一步,要么从第1层台阶走两步。但是第1层和第2层的走法我们已经确定,只需要对其求和即可
- 从中可以发现规律,如果台阶个数为i,那么其走法为台阶个数为i-1和i-2的走法之和
- 所以动态转移方程为dp[i] = dp[i - 1] + dp[i - 2]
- 最终可以根据给的台阶个数,算出每一种台阶个数的走法,最后返回结果即可
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是参数大小
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是参数大小
九【代码实现】
- Java语言版
package DynamicProgramming;
public class p70_ClimbingStairs {
public static void main(String[] args) {
int res = climbStairs(3);
System.out.println("res = " + res);
}
public static int climbStairs(int n) {
if (n <= 1) {
return n;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
int climbStairs(int n)
{
if (n <= 1)
{
return n;
}
int* dp = (int*)malloc(sizeof(int) * (n + 1));
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版