🪙 最少次数拿完所有力扣币 —— 贪心 + 数学技巧详解
本文将带你从一道看似简单的“拿硬币”问题出发,深入理解贪心思想、整数运算技巧以及代码优化思路,让你不仅会解,还能写出更优雅高效的代码。
📘 题目描述
你有 n
堆力扣币,第 i
堆有 coins[i]
枚硬币。
每次操作可以从任意一堆中:
- 拿走 1 枚硬币,或
- 拿走 2 枚硬币。
目标:
用最少的操作次数将所有的硬币都拿走。
🔒 限制条件:
1 <= n <= 4
1 <= coins[i] <= 10
🔍 示例说明
示例 1:
输入: [4, 2, 1]
输出: 4
解释:
- 4 枚 → 拿两次(每次 2 枚)→ 2 次;
- 2 枚 → 拿一次(2 枚)→ 1 次;
- 1 枚 → 拿一次(1 枚)→ 1 次;
总共:2 + 1 + 1 = 4 次。
示例 2:
输入: [2, 3, 10]
输出: 8
解释:
- 2 枚 → 1 次(2 枚);
- 3 枚 → 2 次(2 + 1);
- 10 枚 → 5 次(5 次拿 2 枚);
总共:1 + 2 + 5 = 8 次。
🧠 解题思路分析
由于每次最多能拿走 2 枚,为了减少总次数,自然希望尽量多拿,也就是每次都优先尝试拿 2 枚。
那么对每一堆 coin