🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->拿硬币
问题描述
桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
示例 1:
输入:
[4,2,1]输出:
4解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。
示例 2:
输入:
[2,3,10]输出:
8
限制:
1 <= n <= 41 <= 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。