力扣第70题记录

博客介绍了如何使用动态规划解决爬楼梯问题,给出了两种解法:一种是使用数组存储状态转移,另一种是递归解法,并通过哈希表避免重复计算。还提供了一个循环解法,自底向上计算每个台阶的方法数。最后,展示了代码实现和测试过程。
摘要由CSDN通过智能技术生成

一、题目:70. 爬楼梯
70
二、题目解析:

题目解析:该题属于动态规划的题目,假设用f(i)表示爬到第i个台阶的不同方法数 则f(1) = 1 因为每次只能爬一个 f(2) = 2 因为可以一个一个爬,也可以一次爬两个台阶,所以有两种方法因为一次只能爬一个或两个台阶,所以状态转移方程是 f(i)=f(i-1)+f(i-2),因为f(1)和f(2)已经知道,所以可以推导出f(n)
解题步骤:

  1. 如果是第一个和第二个台阶直接返回即可
  2. 否则初始化第一和第二个台阶
  3. 从第三个台阶开始,当前台阶等于前两个台阶不同路径数的和

图示帮助理解:
70

三、代码如下:

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;
}

四、测试
70

五、结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Run,boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值