代码随想录算法训练营第三十八天| LeetCode509.斐波那契数、LeetCode70.爬楼梯、LeetCode746.使用最小花费爬楼梯

LeetCode 509 斐波那契数

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

【解题思路】

  • 1.确定dp数组以及下标的含义

    • dp[i]的定义为:第i个数的斐波那契数值是dp[i]

  • 2.确定递推公式

    • 递推公式就是题目说的斐波那契值递推公式

  • 3.确定dp数组如何初始化

    • 题目也已经告诉我们了dp[0]和dp[1]的值

  • 4.确定遍历顺序

    • 因为我们需要按照递推公式:由前两个值推导第三个值,所以只能从前往后遍历

  • 5.举例推导dp数组

    • 按照题目要求手动推一遍斐波那契数值,再将我们代码输出的dp数组打印出来对照纠错。

【解题步骤】

  • 1.如果n<=1,直接return n

  • 2.创建一个int数组dp,长度为n+1用来存放斐波那契数

  • 3.按照题目给的数值,初始化dp[0]和dp[1]

  • 4.从i=2开始逐步往后推,直到i<=n:

    • 按照递推公式给当前位置的dp数组赋值

  • 5.返回dp数组第n个位置元素

【代码部分】

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 index = 2; index <= n; index++){
            dp[index] = dp[index - 1] + dp[index - 2];
        }
        return dp[n];
    }
}

LeetCode 70 爬楼梯

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

【解题思路】

  • 1.确定dp数组以及下标的含义

    • dp[i]的定义是:爬到第i层楼梯,由dp[i]种方法

  • 2.确定递推公式

    • 因为题目说了只能一次走一步或者走两步,因此当前楼梯就有“前两层楼梯的方法之和”种方法前进,也就是:

      • dp[i] = dp[i-1]+dp[i-2](斐波那契数)

  • 3.确定dp数组如何初始化

    • 因为dp[0]无论是等于0还是等于1都能说通,为了避免争议,我们初始化dp[1]=1,dp[2]=2

  • 4.确定遍历顺序

    • 因为我们必须根据前两层的前进方法推出当前层的前进方法,所以只能从前向后遍历

  • 5.举例推导dp数组

    • 按照题目要求手动推一遍结果,再将我们代码输出的dp数组打印出来对照纠错。

【解题步骤】

  • 1.如果n<= 2,直接return n

  • 2.创建一个int数组dp,长度为n+1用来存放斐波那契数

  • 3.按照题目给的数值,初始化dp[1]=1,dp[2]=2

  • 4.从i=3开始逐步往后推,直到i<=n:

    • 按照递推公式给当前位置的dp数组赋值

  • 5.返回dp数组第n个位置元素

【代码部分】

public int climbStairs(int n) {
    int[] dp = new int[n + 1];
    dp[0] = 1;
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}

LeetCode 746 使用最小花费爬楼梯

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

【解题思路】

  • 1.确定dp数组以及下标的含义

    • dp[i]的定义为:到达第i层所花费的最少体力为dp[i]

  • 2.确定递推公式

    • dp[i] = min(dp[i1]+cost[i-1]+dp[i-2]+cost[i-2])

  • 3.确定dp数组如何初始化

    • dp[0]=0,dp[1]=1

  • 4.确定遍历顺序

    • 因为我们需要按照递推公式:由前两个值推导第三个值,所以只能从前往后遍历

  • 5.举例推导dp数组

    • 手动推导一下答案,然后将数组打印出来,对照着看看是否出错,在哪里出的错

【解题步骤】

  • 1.定义一个len变量,记录传入的cost数组长度

  • 2.定义一个dp数组,长度为len+1,记录我们的台阶层数

  • 3.初始化dp[0]=0;dp[1] = 1

  • 4.从i=2开始遍历整个cost数组长度:

    • 当前层的花费为前两层的前进方法加上花费的最小值

  • 5.返回dp数组最后位置的元素(跳到楼顶所花费的最少体力)

【代码部分】

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int[] dp = new int[len + 1];

        // 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0
        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];
    }
}

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值