算法训练营第四十一天|LeetCode509、70、746

文章详细介绍了如何使用递归五部曲方法解决LeetCode上的斐波那契数和爬楼梯问题,包括确定dp数组的意义、递推公式、初始化、遍历顺序,并给出了相应问题的Java代码实现。

题目:

题目连接:509. 斐波那契数 - 力扣(LeetCode)

个人思路:递归五部曲:

  1. 确定dp数组的含义和下标的含义:首先是下标的含义,下标表示第几个斐波那契数,dp[i]就表示第i个斐波那契数是多少。(我这里数组new了n+1,目的就是为了让第n个数对应的数组的值为dp[n],因为实际上数组长度为n的话,那么第当下标为n时显示数组越界)

  1. 确定递推公式:题目已经给了我们了F(n) = F(n-1)+F(n-2)

  1. dp数组初始化:题目也已经给了我们了从0和1开始

  1. 确定遍历顺序:因为dp[i] = dp[i-1]+dp[i-2],可以看出当前的值等于前两个值相加,因此是从前往后遍历

  1. 打印dp数组:因为代码没有出现错误,因此这里不打印

代码

class Solution {
    public int fib(int n) {
        if(n<=1) return n;
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = 1;

        for(int i=2;i<=n;i++){
            dp[i] = dp[i-1]+dp[i-2];

        }
        return dp[n];
    }
}

题目连接:70. 爬楼梯 - 力扣(LeetCode)

个人思路:递归五部曲

  1. 确定dp数组的含义和下标的含义:首先是下标,下标表示当前是第几阶。dp[i]表示总共有dp[i]种方法到达第i阶

  1. 确定递推公式:慢慢举例子:首先如果只有一个台阶,那么就只有一种方法;如果有两个台阶那么我就有两种方法;如果有第三个台阶,那么第三个台阶我应该有多少种方法?

我们要明确,第三个台阶,是在第一个台阶和第二个台阶的基础上上去的,因为我一次只能走一步或者两步。如果我先走了一步到达了第一个台阶,那么我再一次走两步,或者一步一步的往上走,就可以走到第三个台阶;如果我先走了两步,到达第二个台阶,那么再走一步就可以到达第三个台阶。因此,我们可以简单的推出,走到第i个台阶的方法,应该是前两个台阶的方法的和,即:dp[i] = dp[i-1]+dp[i-2]。

  1. 确定dp数组初始化:我们dp数组初始化要能和我们dp数组的含义和下标的含义对的上才行,即,第0个台阶,我有多少种方法,第一个台阶我有多少种方法。我们可以看成第0个台阶,我们没有动作,因此没有方法,等于0;第一个台阶一种方法,第二个台阶两种方法。综上我们初始化dp[1]、dp[2],他们的含义是,第一层台阶的方法数和第二个台阶的方法数

  1. 确定遍历顺序:第i个台阶的方法数等于前两个台阶的方法数之和,因此是从前往后

  1. 打印dp数组:没有错误不打印

代码

class Solution {
    public 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];

    }
}

题目连接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)

个人思路:递归五部曲

  1. 确定dp数组的含义和下标的含义:首先是下标的含义,它表示第i个台阶,dp[i]的含义就是到达第i个台阶的花费是多少

  1. 确定递推公式:因为我们求的是到达楼顶的最小花费,那么到达第i个台阶的最小花费是多少,假设我现在在第四个台阶,我要到第五个台阶,那么第五个台阶的花费就等于到达第四个台阶的花费加上我去往第五个台阶的花费,即到达第i个台阶的花费等于到达前一个台阶的花费加上去往下一个台阶的花费dp[i] = dp[i-1]+cost[i-1];又因为我们一次可以走两步或者一步,因此花费还会等于前两个到达的台阶加上前两个的台阶去往下一个台阶的花费dp[i] = dp[i-2]+cost[i-2]。我们要在这两个花费中取得最小值,即:dp[i]=Math.min( dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

  1. 确定dp数组初始化:题目中给出了我可以选择从下标为0或者1的位置开始往上跳,也就是说,当我在下标0或者1这个位置的时候我这里是不花费的,等到我决定开始跳的时候我才会进行花费

  1. 遍历顺序:从前往后

  1. 打印dp数组:没有错误不打印

代码

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int[] dp = new int[len+1];
        dp[0] = 0;
        dp[1] = 0;
        for(int i =2;i<=len;i++){
            dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[len];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值