一、题目:70. 爬楼梯
二、题目解析:
题目解析:该题属于动态规划的题目,假设用f(i)表示爬到第i个台阶的不同方法数 则f(1) = 1 因为每次只能爬一个 f(2) = 2 因为可以一个一个爬,也可以一次爬两个台阶,所以有两种方法因为一次只能爬一个或两个台阶,所以状态转移方程是 f(i)=f(i-1)+f(i-2),因为f(1)和f(2)已经知道,所以可以推导出f(n)
解题步骤:
- 如果是第一个和第二个台阶直接返回即可
- 否则初始化第一和第二个台阶
- 从第三个台阶开始,当前台阶等于前两个台阶不同路径数的和
图示帮助理解:
三、代码如下:
public int climbStairs(int n){
//爬第一阶和第二阶直接返回即可
if(n==1 || n==2){
return n;
}
//n+1是因为数组下标是从零开始的,而这里第i阶需要映射到数组下标
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];
}
//递归解法:自订向下求解
class Solution {
//避免重复计算引入,map
Map<Integer,Integer> map = new HashMap<>();
public int climbStairs(int n) {
if(n==1)return 1;
if(n==2)return 2;
if(null!=map.get(n)){
return map.get(n);
}else{
int res=climbStairs(n-1)+climbStairs(n-2);
map.put(n,res);
return res;
}
}
}
//循环解法:自下向顶求解
public int climbStairs(int n) {
if(n==1)return 1;
if(n==2)return 2;
int result = 0;
int prePre = 1;
int pre = 2;
for(int i=3;i<=n;i++){
result = pre+ prePre;
prePre = pre;
pre = result;
}
return result;
}
四、测试
五、结束