力扣每日一题 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)

相关推荐
漫随流水9 小时前
leetcode算法(151.反转字符串中的单词)
数据结构·算法·leetcode
ada7_10 小时前
LeetCode(python)78.子集
开发语言·数据结构·python·算法·leetcode·职场和发展
DeepVis Research10 小时前
【AGI/Simulation】2026年度通用人工智能图灵测试与高频博弈仿真基准索引 (Benchmark Index)
大数据·人工智能·算法·数据集·量化交易
努力学算法的蒟蒻10 小时前
day52(1.3)——leetcode面试经典150
算法·leetcode·面试
leoufung10 小时前
LeetCode 97. 交错字符串 - 二维DP经典题解(C语言实现)
c语言·算法·leetcode
leiming612 小时前
c++ map容器
开发语言·c++·算法
杨校13 小时前
杨校老师课堂备赛C++信奥之模拟算法习题专项训练
开发语言·c++·算法
世洋Blog13 小时前
AStar算法基础学习总结
算法·面试·c#·astar·寻路
haing201913 小时前
七轴协作机器人运动学正解计算方法
算法·机器学习·机器人