【力扣一刷】代码随想录day38(动态规划part1:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼)

目录

【动态规划理论基础】

【509. 斐波那契数】简单题

方法一  用额外的数组存储每个状态

方法二  用2个遍历存储前两个状态(减小空间复杂度)

【70. 爬楼梯】简单题

【746. 使用最小花费爬楼】简单题


【动态规划理论基础】

1、定义:英文为Dynamic Programming,简称DP

2、步骤:

  • 确定变量 f(i) 的含义
  • 确定递推公式:如 f(i) 和 f(i-1)、f(i-2) 的关系,自变量的数量根据具体情况而定
  • 如何初始化
  • 确定遍历顺序
  • 举例推导dp数组


【509. 斐波那契数】简单题

方法一  用额外的数组存储每个状态

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

        for (int i = 2; i < n+1; i++){
            list[i] = list[i-1] + list[i-2];
        }
        return list[n];
    }
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

方法二  用2个遍历存储前两个状态(减小空间复杂度)

注意:for循环主要是控制计算的次数,初始值已经知道 f(0) 和 f(1) 的值了,计算从 f(2) 到 f(n) 的值,i 从2开始,直至n,共计算 n - 2 + 1 = n - 1 次。

class Solution {
    public int fib(int n) {
        if (n <= 1) return n;
        int x1 = 0;
        int x2 = 1;
        int y = 0;

        for (int i = 2; i < n+1; i++){
            y = x1 + x2;
            x1 = x2;
            x2 = y;
        }
        return y;
    }
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)


【70. 爬楼梯】简单题

思路:为 n = 1 和 n = 2 构造前面两个变量的值,使其都可以通过for循环计算

对于 n = 1,结果为1,对于 n = 2,结果为2,可以推出 n = 0,结果为 2 - 1 = 1。

对 n = 1 来说,除了 n = 0外还差一个 f(i-2)的值,可以初始化为 1 - 1 = 0。

class Solution {
    public int climbStairs(int n) {
        int x1 = 0;
        int x2 = 1;
        int y = 0;
        for (int i = 1; i <= n; i++){
            y = x1 + x2;
            x1 = x2;
            x2 = y;
        }
        return y;
    }
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)


【746. 使用最小花费爬楼】简单题

思路:

1、分别计算从第 i 阶起跳至少要花费的钱。

2、楼顶肯定是第 cost.length - 1 阶或者第 cost.length - 2 阶楼梯起跳跳上去的,所以返回这两个之中的最小值即可。

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int x1 = cost[0];
        int x2 = cost[1];
        int y = 0;
        for (int i = 2; i < cost.length; i++){
            y = Math.min(x1, x2) + cost[i]; // 计算从第i阶楼梯起跳最少要花费的钱
            x1 = x2;
            x2 = y;
        }
        return Math.min(x1, x2);
    }
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值