算法剩余部分

在准备面试的过程中发现之前漏掉了一些算法的整理,在本文中慢慢补齐

动态规划

太抽象,还是以零钱问题为例吧。

其实凡是涉及到这种重叠子问题的,都可以用动态规划。

重叠子问题是啥意思?就是大问题拆解成的小问题,可以递归+缓存,比如电影院第几排或者斐波拉契数列,自顶向下,肯定会有部分重叠子问题,如果用缓存,drill down的时候缓存起来。缺点是什么:这样其实还是会去遍历,只能会再走缓存,性能强一些。

有时候,可以递归+贪心,比如零钱,先从最大面额的开始递归,提高性能。

有没有更厉害的解法?就是动态规划。听着挺唬人的,其实就那样。先按照零钱问题走一遍。

初始化状态 -> 确定状态参数 -> 设计决策的思路

初始化是什么,就是amount=0,需要的最小硬币数,dp[0]=0 然后其他每个的初始值都是 dp[i]=Integer.MAX_VALUE(只需要比amount大就行)

然后是状态参数。啥意思?子问题和原问题之间发生变化的变量。状态参数是dp[j],它记录了达到金额j所需的最少硬币数量。

然后就是设计决策,状态转移方程,描述了如何从已知状态推导出未知状态的过程。要怎么逐步获取到我们要的结果dp[amount]呢?对于每种硬币coin,考虑将其加入到构成总金额的过程中。对于每一个j >= coin,我们检查如果使用了一个面值为coin的硬币,那么剩余的金额变为j - coin。如果dp[j - coin]已经有了一个有效的值(即不是Integer.MAX_VALUE),说明存在一种方式可以凑成j - coin,那么我们就可以通过增加一个coin硬币来考虑凑成j的方案,即更新dp[j] = min(dp[j], dp[j - coin] + 1)。这里dp[j - coin] + 1意味着在已有凑成j - coin最少硬币数基础上再加一个硬币。

我们从最小的金额开始,逐步向上构建,直到求得目标金额amount所需的最少硬币数。每一步的决策都是基于之前的最优解,确保了最终得到的是全局最优解。

对应代码

public class Solution322 {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        // 初始化
        Arrays.fill(dp, amount + 1);
        dp[0] = 0;

        // 状态方程
        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                if (coin <= i) {
                    dp[i] = Math.min(dp[i], dp[i-coin]+1);
                }
            }
        }
        return dp[amount] == amount+1 ? -1:dp[amount];
    }
}

相关推荐

  1. 算法剩余部分

    2024-07-21 12:24:02       16 阅读
  2. 算法总结归纳(第十二天)(剩余的图论)

    2024-07-21 12:24:02       56 阅读
  3. 中国剩余定理

    2024-07-21 12:24:02       41 阅读
  4. ES6 剩余函数

    2024-07-21 12:24:02       52 阅读
  5. 中国剩余定理学习

    2024-07-21 12:24:02       28 阅读
  6. 排序算法部分总结

    2024-07-21 12:24:02       40 阅读
  7. 显示剩余时间的脚本

    2024-07-21 12:24:02       42 阅读
  8. 获取磁盘剩余容量-----c++

    2024-07-21 12:24:02       14 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 12:24:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 12:24:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 12:24:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 12:24:02       55 阅读

热门阅读

  1. 【SQL】百万千万级最大表如何添加字段

    2024-07-21 12:24:02       18 阅读
  2. 谓词 & lambda & bind()

    2024-07-21 12:24:02       14 阅读
  3. 系统运维的数字化与智能化探索

    2024-07-21 12:24:02       16 阅读
  4. Python异常处理

    2024-07-21 12:24:02       13 阅读
  5. 力扣题解(完全平方数)

    2024-07-21 12:24:02       20 阅读
  6. leetcode位运算(1720. 解码异或后的数组)

    2024-07-21 12:24:02       16 阅读
  7. 数据结构 day1

    2024-07-21 12:24:02       14 阅读
  8. 5 webSocket

    2024-07-21 12:24:02       18 阅读
  9. 什么是样本不平衡?

    2024-07-21 12:24:02       16 阅读