LCP 06. 拿硬币

简介: LCP 06. 拿硬币

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

问题描述

桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

示例 1:

输入:[4,2,1]

输出:4

解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

示例 2:

输入:[2,3,10]

输出:8

限制:

  • 1 <= n <= 4
  • 1 <= coins[i] <= 10

思路分析

首先我们应该要先理解一下题目意思,题目会给我们一个长度为n整数数组coins,代表桌子上有n堆硬币,我们每次可以选择任意一堆,拿走其中的一枚或者两枚,需要我们计算取完桌面上所有硬币所需要的次数,这里需要注意一下,我们每次取硬币的时候只能取同一堆硬币里的,也就是说如果有两堆数量都为1的硬币时,我们也不可以同时将两个硬币取走,我们每次只能选择其中一堆进行取硬币操作。

如:[1,1,1],这里有三堆硬币,虽然每一堆都只有一个硬币,但我们不能跨堆混取硬币,我们只能先将一堆的硬币取完,所以我们需要取三次才可以将硬币取完,每次选择任意一堆,将那一堆的1枚硬币取走即可。

理解了题目之后,我们会发现题目其实并不难,我们只需要遍历数组,求出每堆硬币取完所需次数,再计算总和即可。因为每次只能取一枚或两枚硬币,为了减少取硬币的次数,我们肯定是优先取两枚,直到硬币数量少于两枚的时候再取一枚,所以这里我们可以直接使用每堆的硬币数除以2并向上取整就可以得到当前硬币堆取完所需的次数。

let res = 0;
coins.forEach((coin) => {
    res += Math.ceil(coin / 2);
});

AC 代码

完整 AC 代码如下:

/**
 * @param {number[]} coins
 * @return {number}
 */
var minCount = function (coins) {
  let res = 0;
  coins.forEach((coin) => {
    res += Math.ceil(coin / 2);
  });
  return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
6月前
|
测试技术
【动态规划】【状态压缩】LCP04 覆盖
【动态规划】【状态压缩】LCP04 覆盖
|
6月前
|
算法 测试技术 C++
【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目
【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目
|
6月前
|
算法 测试技术 C++
【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠
【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠
【动态规划】【树形dp】【深度优先搜索】LCP 26. 导航装置
【动态规划】【树形dp】【深度优先搜索】LCP 26. 导航装置
|
6月前
【每日一题Day332】LCP 06. 拿硬币 | 模拟
【每日一题Day332】LCP 06. 拿硬币 | 模拟
34 0
|
6月前
【每日一题Day327】LCP 50. 宝石补给 | 模拟
【每日一题Day327】LCP 50. 宝石补给 | 模拟
53 0
|
6月前
|
算法 测试技术 C#
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
|
6月前
|
算法 测试技术 C#
【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目
【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目
【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目
|
6月前
|
C++
LCP 06. 拿硬币(C++)
LCP 06. 拿硬币(C++)
41 0
|
6月前
leetcode-LCP 06. 拿硬币
leetcode-LCP 06. 拿硬币
31 0