解题思路
1、暴力搜索、回溯法:
- 当前可走1步,递归回溯剩下的台阶走法
- 当前可走2步,递归回溯剩下的台阶走法
2、动态规划:由于每次最多爬2阶,楼梯的第i阶,只可能从楼梯的
i
−
1
i-1
i−1阶与
i
−
2
i-2
i−2阶到达。故第i阶有多少种爬法,只与第
i
−
1
i-1
i−1阶、第
i
−
2
i-2
i−2阶的爬法数量直接相关
因此有递推关系式
:
O
P
T
(
i
)
=
O
P
T
(
i
−
1
)
+
O
P
T
(
i
−
2
)
:OPT(i)=OPT(i-1)+OPT(i-2)
:OPT(i)=OPT(i−1)+OPT(i−2)
解题代码
class Solution { //思路一(LeetCode下时间超时)
public int climbStairs(int n) {
if(n == 1) //递归出口1:当只有一个台阶时,这个时候只有一种方法爬楼梯
return 1;
else if(n == 2) //递归出口2:当只有两个台阶时,这个时候只有两种方法爬楼梯
return 2;
else{
int A = climbStairs(n-1); //在当前情况下选择爬1个台阶
int B = climbStairs(n-2); //在当前情况下选择爬2个台阶
return A + B;
}
}
}
class Solution {
public int climbStairs(int n) { //思路二
int[] dp = new int[n + 3]; //数组大小为n+3的原因的原因是防止数组发生越界异常
for(int i = 0; i < n + 3; i++)
{
dp[i] = 0;
}
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
总结
动态规划的原理:
- 确定原问题和子问题
- 确定状态
- 确定边界状态的值
- 确定转移方程