代码随想录算法训练营第三十六天|509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

509. 斐波那契数

public static int fib(int n) {
    // 找出最后一步

    // 定义损失函数 定义记忆化存储基本单元

    // 状态转移方程 f(n) = f(n-2)+f(n-1); n > 0

    // 边界 (递归过程中需要判断)
    // 初始化 (在未递归之前需要处理)
    // 返回答案
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }

    int[] dp = new int[n];
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i < n; i++) {
        findFibonacci(i, dp);
    }

    return dp[n - 1] + dp[n - 2];

}

public static void findFibonacci(int n, int[] dp) {
    dp[n] = dp[n - 1] + dp[n - 2];
}

70. 爬楼梯 

public static int climbStairs(int n) {
    //找出最后一步

    //定义损失函数 定义记忆化存储基本单元

    //状态转移方程 f(n) = f(n-2)+2; n > 0
    // f(n) = f(n-1)+1; n > 0

    //边界 (递归过程中需要判断)
    //初始化 (在未递归之前需要处理)
    //返回答案
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }

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

public static void climbStair(int n, int[] dp) {
    dp[n] = dp[n - 1] + dp[n - 2];
}

746. 使用最小花费爬楼梯

public static int minCostClimbingStairs(int[] cost) {
    int stairCase = cost.length + 1;
    // 找出最后一步
    // 定义损失函数 定义记忆化存储基本单元
    // 状态转移方程 f(n) = cost[n-1] > cost[n-2]?cost[n-2]:cost[n-1] n>2
    // f(n) = f(n-1)+1; n > 0
    // 边界 (递归过程中需要判断)
    // 初始化 (在未递归之前需要处理)
    // 返回答案
    if (stairCase == 1) {
        return 0;
    }
    if (stairCase == 2) {
        return cost[0];
    }

    int[] dp = new int[cost.length + 2];
    dp[0] = 0;
    dp[1] = 0;
    dp[2] = 0;
    for (int i = 3; i < dp.length; i++) {
        costClimbingStairs(dp, cost, i);
    }

    return dp[dp.length - 1];

}

public static void costClimbingStairs(int[] dp, int[] cost, int index) {
    if (dp[index - 1] + cost[index - 2] <= dp[index - 2] + cost[index - 3]) {
        dp[index] = dp[index - 1] + cost[index - 2];
    } else {
        dp[index] = dp[index - 2] + cost[index - 3];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值