当前位置: 首页 > news >正文

每日一练:零钱兑换

322. 零钱兑换 - 力扣(LeetCode)

题目要求:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

解法-1 动态规划 O(N)

        创建一个dp表,对应下标存放需要的最小硬币数,如果不能得到就存放-1。

        要得到 i 的最小硬币数,就需要先得到dp的下标为 i-coins[ j ](0<=j<coins.size()) 中存放最少的硬币数加1;

        先初始化一些容易得到的最少硬币数,然后开始填表

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, -1);dp[0] = 0; // 不需要硬币的for (int i = 0; i < coins.size(); i++) // 只需要一个硬币的{if(coins[i] <= amount)dp[coins[i]] = 1;}for (int i = 1; i <= amount; i++) { // 填表if (dp[i] == -1) {int MIN = INT_MAX;for (int j = 0; j < coins.size(); j++) {if (coins[j] > i) // 边界处理continue;if (dp[i - coins[j]] > 0) { // 该金额能得到才进行比较MIN = min(MIN, dp[i - coins[j]]); // 得到最少硬币数}}if (MIN != INT_MAX) // 如果可以兑换i,则赋值;否则保留-1表示不能得到dp[i] = MIN + 1;}}return dp[amount];}
};


http://www.mrgr.cn/news/41773.html

相关文章:

  • 马铃薯病害数据集:农业智能领域的核心资源与技术创新应用(猫脸码客 第206期)
  • STL之vector
  • VSCode调试Vue项目方法
  • 中国雕塑-孙溟㠭浅析碑帖《孔子庙堂碑》
  • 本人自定义的GO包说明【实用,建议收藏】
  • Stable Diffusion绘画 | 来训练属于自己的模型:LoRA模型验收
  • Python库pandas之四
  • 一些 Go Web 开发笔记
  • 华为云技术深度解析:以系统性创新加速智能化升级
  • 管理方法(12)-- 采购管理
  • 高级java每日一道面试题-2024年10月1日-服务器篇[Redis篇]-Redis数据结构压缩列表和跳跃表的区别?
  • Vue H5(手写)实现下拉刷新
  • FreeRTOS篇8:二值信号量
  • Stream流的终结方法
  • 使用python iter方法读取文件
  • arduino点亮墨水屏
  • 第十四讲-输入控件QPlainTextEdit
  • “衣依”服装销售平台:Spring Boot技术实践与创新
  • 深度学习应用
  • YOLO11改进|上采样篇|引入DySample轻量级动态上采样器