力扣每日一题 2024/3/24 零钱兑换

题目描述

用例说明

思路讲解

动态规划五步法

第一步确定dp数组的含义:dp[i]为凑到金额为i所用最少的硬币数量

第二步确定动态规划方程:凑足金额为j-coins[i]所需最少的硬币个数为dp[j-coins[i]],那凑足金额为j所用的最少硬币数为dp[j-coins[i]]+1

第三步初始化:凑足金额为0所需硬币数为0,即dp[0]=0

此外dp数组内其他值也需初始化为最大值,否则在遍历coins数组计算金额的时候容易被覆盖

第四步遍历顺序:外层遍历物品,内层遍历背包容量

第五步推导得出dp[amount]

代码

java 复制代码
class Solution {
    public int coinChange(int[] coins, int amount) {
      int max=Integer.MAX_VALUE;
      int[] dp=new int[amount+1];
      for(int i=0;i<dp.length;i++){
        dp[i]=max;
      }
      dp[0]=0;
      for(int i=0;i<coins.length;i++){
        for(int j=coins[i];j<=amount;j++){
            if(dp[j-coins[i]]!=max){
                dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);
            }
        }
      }
      return dp[amount]==max?-1:dp[amount];
    }
}

复杂度

时间复杂度O(n*amount)

空间复杂度O(amount)

相关推荐
tankeven13 小时前
HJ93 数组分组
c++·算法
Σίσυφος190013 小时前
LM 在 PnP(EPnP / P3P)的应用
算法
陈天伟教授13 小时前
人工智能应用- 人工智能交叉:01. 破解蛋白质结构之谜
人工智能·神经网络·算法·机器学习·推荐算法
LightYoungLee14 小时前
General-behavior interview tutorials
算法
I_LPL14 小时前
day34 代码随想录算法训练营 动态规划专题2
java·算法·动态规划·hot100·求职面试
We་ct14 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:题解与思路解析
前端·算法·leetcode·链表·typescript
万象.15 小时前
redis集群算法,搭建,故障处理及扩容
redis·算法·哈希算法
plus4s15 小时前
2月19日(85-87题)
c++·算法
Desirediscipline15 小时前
cerr << 是C++中用于输出错误信息的标准用法
java·前端·c++·算法
Renhao-Wan15 小时前
Java 算法实践(八):贪心算法思路
java·算法·贪心算法