LeetCode每日一题[c++]-322.零钱兑换

题目描述

给你一个整数数组 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.贪心
1.1 想要总硬币数最少,肯定是优先用大面值硬币,所以对 coins 按从大到小排序

        先丢大硬币,再丢会超过总额时,就可以递归下一层丢的是稍小面值的硬币
2. 乘法对加法的加速
        2.1 优先丢大硬币进去尝试,也没必要一个一个丢,可以用乘法算一下最多能丢几个

                k = amount / coins[c_index] 计算最大能投几个
                amount - k * coins[c_index] 减去扔了 k 个硬币
                count + k 加 k 个硬币

        如果因为丢多了导致最后无法凑出总额,再回溯减少大硬币数量
3. 最先找到的并不是最优解
3.1 注意不是现实中发行的硬币,面值组合规划合理,会有奇葩情况

        考虑到有 [1,7,10] 这种用例,按照贪心思路 10 + 1 + 1 + 1 + 1 会比 7 + 7 更早找到
所以还是需要把所有情况都递归完
4. ans 疯狂剪枝
4.1 贪心虽然得不到最优解,但也不是没用的

        我们快速算出一个贪心的 ans 之后,虽然还会有奇葩情况,但是绝大部分普通情况就可以疯狂剪枝了

复杂度分析

时间复杂度:O(Sn),其中 S是金额,n是面额数。我们一共需要计算 S个状态的答案,且每个状态 F(S)由于上面的记忆化的措施只计算了一次,而计算一个状态的答案需要枚举 n个面额值,所以一共需要 O(Sn)的时间复杂度。
空间复杂度:O(S),我们需要额外开一个长为 S 的数组来存储计算出来的答案 F(S)。

代码

void coinChange(vector<int>& coins, int amount, int c_index, int count, int& ans) {
    if (amount == 0) {
        ans = min(ans, count);
        return;
    }
    if (c_index == coins.size()) return;

    for (int k = amount / coins[c_index]; k >= 0 && k + count < ans; k--) {
        coinChange(coins, amount - k * coins[c_index], c_index + 1, count + k, ans);
    }
}

int coinChange(vector<int>& coins, int amount) {
    if (amount == 0) return 0;
    sort(coins.rbegin(), coins.rend());
    int ans = INT_MAX;
    coinChange(coins, amount, 0, 0, ans);
    return ans == INT_MAX ? -1 : ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统磁盘管理

这里写目录标题 Linux系统磁盘管理磁盘容量检查磁盘分区fdisk分区gdisk分区 磁盘格式化磁盘挂载临时挂载磁盘永久挂载磁盘卸载挂载磁盘 交换分区SWAP创建swapfile格式化swap分区检测当前swap分区情况开启新建的SWAP分区关闭新建的swap分区 生产磁盘故障案例 Linux系统磁盘管理 …

【LeetCode热题100】108. 将有序数组转换为二叉搜索树

一.题目要求 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#x…

Python - epub2txt

文章目录 关于 epub2txt安装 命令行使用查看 options常见用法示例1 Python 代码调用manualabsl.app:absl.logging:epub2txt.__main__:absl.flags: 关于 epub2txt Convert epub file to txt github : https://github.com/ffreemt/epub2txt 安装 pip install epub2txt命令行使…

这个极其适合新手的Facebook聊单模式!必学!极度友好!

基于现在的网络流量来说&#xff0c;Facebook不仅仅是个人的社交圣地&#xff0c;更加是很多卖家的黄金市场&#xff0c;背后蕴藏着无限的商业潜力。对于刚刚踏入电商领域的新手而言&#xff0c;Facebook这个平台是个很好地展示产品、吸引客户&#xff0c;并实现销售的地方。 …

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话&#xff1a; 充满着欢乐与斗争精神的人们&#xff0c;永远带着欢乐&#xff0c;欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(&#xff65;ω&#xf…

WorkPlus AI助理,为企业提供智能化客户服务,助力企业发展与竞争力

在当今竞争激烈的商业环境中&#xff0c;提供优质高效的客户服务是企业取得成功的关键。而AI智能客服的崛起&#xff0c;以其卓越的性能和功能&#xff0c;助力企业提升客户服务体验。WorkPlus AI助理作为一款领先的解决方案&#xff0c;能够实现智能化客户服务&#xff0c;满足…

TTS通用播放库技术设计

TTS音频播放库技术设计 目录介绍 01.整体介绍概述 1.1 项目背景介绍1.2 遇到问题1.3 基础概念介绍1.4 设计目标1.5 问题答疑和思考 02.技术调研说明 2.1 语音播放方案2.2 TTS技术分析2.3 语音合成技术2.4 方案选择说明2.5 方案设计思路2.6 文本生成音频 03.系统TTS使用实践 3…

如何在CentOS7部署openGauss管理系统并实现固定公网地址连接

文章目录 推荐前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

抖音小店怎么做?起店流程大分享,可收藏!

大家好&#xff0c;我是电商糖果 会开店&#xff0c;但是不会起店。 这是不是很多电商商家遇到难题&#xff0c;尤其是刚开始做抖音小店的商家。 店开好几月也没有流量&#xff0c;不出单。 这里糖果就来分享一下&#xff0c;我这边自己总结的起店流程。 不敢自夸是最好的…

类和对象三部曲(one)

都说C语言是面向过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用来逐步解决问题。 拿洗衣服来举例&#xff0c;C关注的是一个过程&#xff1a; 那么C是什么呢&#xff1f; 面向对象的编程语言。 面向对象对象指什么&#xff1f; 象棋里的对象么&#xff1f;…

大模型时代5个最顶级的向量数据库

大家好&#xff0c;数字时代推动我们进入了由人工智能和机器学习为主导的时代&#xff0c;向量数据库已经成为存储、搜索和分析高维数据向量的不可或缺的工具&#xff0c;本文将介绍5个顶级的向量数据库。 1.Chroma 使用ChromaDB构建LLM应用程序 Chroma是开源嵌入数据库。Chr…

医疗行业对SDWAN专线的需求

随着信息技术的发展和医疗行业的数字化转型&#xff0c;SDWAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络解决方案&#xff0c;越来越受到医疗机构的重视和应用。医疗行业对SDWAN专线的需求主要体现在以下几个方面&#xff1a; 1、高度可靠的网络连接 医疗机构…

YOLOv9改进策略:卷积魔改 | DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测 | CVPR2024

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; DCNv4来自CVPR2024 的论文&#xff0c;它不仅收敛速度明显快于DCNv3&#xff0c;而且正向速度提高了3倍以上。这一改进使DCNv4能够充分利用其稀疏特性&#xff0c;成为最快的通用核心视觉算子之一。 改进结构…

CDP7 下载安装 Flink Percel 包

下载链接&#xff1a;https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本&#xff0c; 然后点击download now&#xff0c;会有一个协议&#xff0c;勾选即可&#xff0c;然后就有三个文件列表&#xff0c; 我这里是已经注册登录的状态&#xff0c;如果没…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

msvcp110.dll丢失修复办法

在计算机使用过程中&#xff0c;我们经常会遇到一些扩展名为.dll的文件&#xff0c;这些文件是动态链接库文件&#xff0c;用于提供程序运行时所需的函数和资源。其中&#xff0c;msvcp110.dll文件是一个非常重要的动态链接库文件&#xff0c;它属于Microsoft Visual C 2012 Re…

学习数据结构:算法的时间复杂度和空间复杂度

一、算法的复杂度 衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c;而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的…

Earth Hour地球一小时

在刚刚过去的周六&#xff08;2024-03-23&#xff09;是个特殊的日子&#xff0c;你知道是什么日子吗&#xff1f; 对&#xff0c;是地球一小时 活动日。 地球一小时”是让全球关心自然、热心环保的人可以共同发声的平台。 当地时间2024年3月23日晚8点30分&#xff0c;“地球…

【保姆级讲解Redis基础命令】

&#x1f308;&#x1f308;&#x1f308;个人主页:程序员不想敲代码啊&#x1f308;&#x1f308;&#x1f308; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c…