网站开发客户挖掘,长治长治那有做网站的,韩雪冬模板网站,陕西省建设网三类人员继续教育【LetMeFly】2952.需要添加的硬币的最小数量#xff1a;贪心#xff08;排序#xff09;
力扣题目链接#xff1a;https://leetcode.cn/problems/minimum-number-of-coins-to-be-added/
给你一个下标从 0 开始的整数数组 coins#xff0c;表示可用的硬币的面值#xff…【LetMeFly】2952.需要添加的硬币的最小数量贪心排序
力扣题目链接https://leetcode.cn/problems/minimum-number-of-coins-to-be-added/
给你一个下标从 0 开始的整数数组 coins表示可用的硬币的面值以及一个整数 target 。
如果存在某个 coins 的子序列总和为 x那么整数 x 就是一个 可取得的金额 。
返回需要添加到数组中的 任意面值 硬币的 最小数量 使范围 [1, target] 内的每个整数都属于 可取得的金额 。
数组的 子序列 是通过删除原始数组的一些可能不删除元素而形成的新的 非空 数组删除过程不会改变剩余元素的相对位置。 示例 1
输入coins [1,4,10], target 19
输出2
解释需要添加面值为 2 和 8 的硬币各一枚得到硬币数组 [1,2,4,8,10] 。
可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到且需要添加到数组中的硬币数目最小为 2 。示例 2
输入coins [1,4,10,5,7,19], target 19
输出1
解释只需要添加一枚面值为 2 的硬币得到硬币数组 [1,2,4,5,7,10,19] 。
可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到且需要添加到数组中的硬币数目最小为 1 。
示例 3
输入coins [1,1,1], target 20
输出3
解释
需要添加面值为 4 、8 和 16 的硬币各一枚得到硬币数组 [1,1,1,4,8,16] 。
可以证明从 1 到 20 的所有整数都可由数组中的硬币组合得到且需要添加到数组中的硬币数目最小为 3 。 提示
1 target 1051 coins.length 1051 coins[i] target
解题方法排序 贪心
二话不说先对coins数组从小到大排个序。使用变量to记录当前能组成到几初始值为0。遍历coins数组
如果coins[i] to 1那么coins[i]就可以“拼接上”原本可以组成的数据范围[1, 2, ..., to]加上coins[i]后就可以组成范围[1, 2, ..., to coins[i]]。因此更新to为to coins[i]否则coins[i] to 1无法“拼接”必须添加新的硬币。既然无法组成to 1那么必须要添加硬币to 1。添加后便能组成到to to 1。
直到to target为止。
时间复杂度 O ( c o i n s log c o i n s log t a r g e t ) O(coins\log coins \log target) O(coinslogcoinslogtarget)最多新增硬币\log target次空间复杂度 O ( log c o i n s ) O(\log coins) O(logcoins)
AC代码
C
class Solution {
public:int minimumAddedCoins(vectorint coins, int target) {sort(coins.begin(), coins.end());int ans 0, to 0, i 0;while (to target) {if (i coins.size() coins[i] to 1) {to coins[i];i;}else {to to 1;ans;}}return ans;}
};Python
# from typing import Listclass Solution:def minimumAddedCoins(self, coins: List[int], target: int) - int:coins.sort()to, ans, i 0, 0, 0while to target:if i len(coins) and coins[i] to 1:to coins[i]i 1else:to to 1ans 1return ans同步发文于CSDN和我的个人博客原创不易转载经作者同意后请附上原文链接哦~ Tisfyhttps://letmefly.blog.csdn.net/article/details/137185903