【Leetcode】2952. 需要添加的硬币的最小数量

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
给你一个下标从 0 0 0 开始的整数数组 c o i n s coins coins,表示可用的硬币的面值,以及一个整数 t a r g e t target target

如果存在某个 c o i n s coins coins 的子序列总和为 x x x,那么整数 x x x 就是一个 可取得的金额

返回需要添加到数组中的 任意面值 硬币的 最小数量 ,使范围 [ 1 , t a r g e t ] [1, target] [1,target] 内的每个整数都属于 可取得的金额

数组的 子序列 是通过删除原始数组的一些(可能不删除)元素而形成的新的 非空 数组,删除过程不会改变剩余元素的相对位置。

示例 1
输入:coins = [1,4,10], target = 19
输出:2
解释:需要添加面值为 2 2 2 8 8 8 的硬币各一枚,得到硬币数组 [ 1 , 2 , 4 , 8 , 10 ] [1,2,4,8,10] [1,2,4,8,10]
可以证明从 1 1 1 19 19 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 2 2 2

示例 2
输入:coins = [1,4,10,5,7,19], target = 19
输出:1
解释:只需要添加一枚面值为 2 2 2 的硬币,得到硬币数组 [ 1 , 2 , 4 , 5 , 7 , 10 , 19 ] [1,2,4,5,7,10,19] [1,2,4,5,7,10,19]
可以证明从 1 1 1 19 19 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 1 1 1

示例 3
输入:coins = [1,1,1], target = 20
输出:3
解释
需要添加面值为 4 4 4 8 8 8 16 16 16 的硬币各一枚,得到硬币数组 [ 1 , 1 , 1 , 4 , 8 , 16 ] [1,1,1,4,8,16] [1,1,1,4,8,16]
可以证明从 1 1 1 20 20 20 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 3 3 3

提示

  • 1 ≤ t a r g e t ≤ 1 0 5 1 \leq target \leq 10^5 1target105
  • 1 ≤ c o i n s . l e n g t h ≤ 1 0 5 1 \leq coins.length \leq 10^5 1coins.length105
  • 1 ≤ c o i n s [ i ] ≤ t a r g e t 1 \leq coins[i] \leq target 1coins[i]target

思路

可以通过贪心算法来解决。我们首先对硬币面值数组进行排序,然后逐步考虑每个需要添加的额外硬币。具体步骤如下:

  1. 对硬币数组进行排序,以便从小到大考虑硬币面值。
  2. 初始化需要的额外硬币数量为0,当前已经能够组成的金额为0。
  3. 遍历排序后的硬币数组,对于每个硬币面值,进行以下操作:
  • 如果当前已经能够组成的金额已经大于或等于目标金额,直接返回需要的额外硬币数量。
  • 如果当前硬币面值减去1大于当前已经能够组成的金额,需要添加额外硬币,数量为当前硬币面值减去1与当前已经能够组成的金额之间的差值。
  • 更新当前已经能够组成的金额为当前硬币面值。
  1. 如果遍历完成后,当前已经能够组成的金额仍然小于目标金额,继续添加额外硬币,数量为目标金额减去当前已经能够组成的金额。

代码

class Solution {
public:
    int minimumAddedCoins(vector<int>& coins, int target) {
        int n = coins.size(), res = 0, ssum = 0;
        sort(coins.begin(), coins.end());
        for (int i = 0; i < n; ++i) {
            if (ssum >= target) {
                return res;
            }
            while (ssum < coins[i] - 1) {
                ++res;
                ssum = ssum * 2 + 1;
            }
            ssum += coins[i];
        }
        while (ssum < target) {
            ++res;
            ssum = ssum * 2 + 1;
        }
        return res; 
    }
};
/*
挺有意思的一个构造题。

不难看出,当你已经可以组成1 -- i所有的数字的时候,,如果下一个出现的数字j小于等于i + 1,那么你就可以直接获得这个数字,并且能通过这个新的数字来组成1 -- i + j的所有数字。这是很好理解的一件事儿,1 -- i的所有数字你本来就有,j -- i + j的所有数字则可以通过你原本能组成的数字再加上j来获取。

那么,如果下一个出现的数字j大于i + 1,这时就需要额外添加数字了。额外添加的数字自然是越大越好——也就是前一种情况里j的最大值i + 1。
*/

复杂度分析

时间复杂度

O(nlogn),遍历硬币数组的时间复杂度为 O(n),因此总的时间复杂度为 O(nlogn)。

空间复杂度

O(1)

结果

在这里插入图片描述

总结

通过贪心算法解决了硬币补充的问题,通过分析问题的特点,找到了最优的添加策略,使得所需的额外硬币数量最小化。

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

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

相关文章

SpringCloud学习(1)-consul

consul下载安装及使用 1.consul简介 Consul是一种开源的、分布式的服务发现和配置管理工具&#xff0c;能够帮助开发人员构建和管理现代化的分布式系统。它提供了一套完整的功能&#xff0c;包括服务注册与发现、健康检查、KV存储、多数据中心支持等&#xff0c;可以帮助开发人…

【C语言】InfiniBand内核驱动_mlx4_ib_post_send

一、注释 以下是_mlx4_ib_post_send函数的注释&#xff0c;该函数用于处理InfiniBand工作请求&#xff08;WRs&#xff09;的发送过程&#xff1a; static int _mlx4_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr, bool …

备考ICA----Istio实验15---开启 mTLS 自动双向认证实验

备考ICA----Istio实验15—开启mTLS自动双向认证实验 在某些生成环境下,我们希望微服务和微服务之间使用加密通讯方式来确保不被中间人代理. 默认情况下Istio 使用 PERMISSIVE模式配置目标工作负载,PERMISSIVE模式时,服务可以使用明文通讯.为了只允许双向 TLS 流量&#xff0c;…

XGB回归预测

关键代码 import numpy as np import matplotlib.pyplot as plt from xgboost import XGBRegressor #pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple import pandas as pd import joblib#处理中文字体 plt.rcParams[font.family] [sans-serif] plt.rcPar…

XMind 2024 下载地址及安装教程

XMind是一款流行的思维导图软件&#xff0c;它帮助用户以图形化的方式组织和呈现思维、概念和信息。XMind可以应用于各个领域&#xff0c;如项目管理、思维导图、会议记录、学习笔记等。 XMind提供了直观和易于使用的界面&#xff0c;用户可以通过拖放和连线来创建思维导图。它…

String、StringBuffer、StringBuilder类

最近在复习 Java 基础的时候&#xff0c;看到了 String 这块的内容&#xff0c;我突发奇想&#xff0c;可以将 String、StringBuffer、StringBuilder 这些知识点整合在一起记忆。我之前背的那个答案其实有点琐碎&#xff0c;而且不太好理解&#xff0c;还繁杂&#xff0c;所以我…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(5)

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 初寒调色案例及练习图 等文件 https://www.alipan.…

Android Studio 识别不到物理机设备

问题 Android Studio 识别不到物理机设备 详细问题 笔者进行Android 项目开发&#xff0c;之前一直可以连接上物理机设备&#xff0c;可能由于笔者对于驱动程序进行更新修改的原因&#xff0c;突然无法连接物理机设备。搜索无数资料&#xff0c;使用无数解决方案&#xff08…

src挖掘技巧总结分享

src挖洞技术分享 src推荐刚入门的新手首选公益src如漏洞盒子、补天src&#xff0c;因为漏洞盒子收录范围广&#xff0c;只要是国内的站点都收入&#xff0c;相比其它src平台挖掘难度非常适合新手。后续可以尝试先从一些小的src厂商入手。 首先是熟能生巧&#xff0c;我一开始挖…

spring(3)

spring6 1、bean生命周期1.1 bean生命周期之五步1.2bean生命周期之七步1.3 bean生命周期之十步1.4 bean作用域与管理周期 2、把自己new的对象交给spring管理3、Bean循环依赖3.1 setsingleton3.2 构造singleton3.3 propotypeset注入3.4 bean循环依赖源码分析&#xff1a;3.5 常见…

图论模板详解

目录 Floyd算法 例题&#xff1a;蓝桥公园 Dijkstra算法 例题&#xff1a;蓝桥王国 SPFA算法 例题&#xff1a;随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题&#xff1a;聪明的猴子 Floyd算法 最简单的最短路径算法&#xff0c;使用邻接…

BGP联盟、对等体组、按组打包

BGP联盟 将大的AS划分为几个子AS&#xff08;成员AS&#xff09;&#xff0c;每个子AS内部建立全连接的IBGP邻居&#xff0c;子AS之间建立EBGP邻接关系。 联盟AS&#xff1a;大AS&#xff0c;就是常说的AS号&#xff0c;一般使用公有AS号。 成员AS&#xff1a;小AS&#xff…

MongoDB 启动异常

Failed to start up WiredTiger under any compatibility version. 解决方案: 删除WiredTiger.lock 和 mongod.lock两个文件&#xff0c;在重新启动。回重新生成新的文件。

Unicode在线编码和解码工具推荐(实用)

Unicode在线编码 - Unicode编码工具 - Unicode在线生成 - Unicode在线解码 - WGCLOUD

研发效能·创享大会—IDCF五周年专场

时光流转&#xff0c;IDCF即将迎来五周年的庆典。在这个意义非凡的时刻&#xff0c;我们精心筹备了一场盛大的聚会【研发效能创享大会—IDCF五周年专场】。 IDCF自2019年成立以来&#xff0c;携手百余位技术领头人共同打造DevOps技术学习平台&#xff0c;与30万社群伙伴联动&a…

数据类型和类型检测

Data Type And Type Checking 1.编程语言中的数据类型 类型和变量 一个类型是一系列值的集合&#xff0c;这些集合可以抽象出一个相同的特点&#xff0c;并且可以相互实现计算 例如&#xff1a; 布尔类型&#xff1a;true or false整形&#xff1a;1,2,3…浮点数类型&#xf…

OM6650AM支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片

OM6650AM是一款超低功耗、同时支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片&#xff0c;采用4.0 mm x 4.0 mm QFN32封装&#xff0c;具有丰富的资源&#xff0c;极低的功耗&#xff0c;优异的射频性能&#xff0c;可广泛应用于车载数字钥匙模组、胎压检测、PKE钥匙…

【教程】Flutter 应用混淆

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

YOLOv9改进策略 :主干优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

💡💡💡本文改进内容: token mixer被验证能够大幅度提升性能,但典型的token mixer为自注意力机制,推理耗时长,计算代价大,而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构 ,在保证性能的同时足够轻量化。 💡💡💡RIFormerBlock引入到YOLOv9,多个数…

C语言第三十八弹---编译和链接

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理&#xff08;预编译&#xff09; 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…