硬币之谜:如何用最少的步骤拿完所有硬币?

本篇博客会讲解力扣“LCP 06. 拿硬币”的解题思路,这是题目链接。

先来审题:
硬币之谜:如何用最少的步骤拿完所有硬币?_第1张图片
本题的思路是:分开计算每一堆硬币最少的拿取次数,再求和。

假设某一堆硬币的个数是x,则最少的拿取次数要考虑x是奇数还是偶数。

  1. 若x是偶数,则每次拿取2个硬币,拿取次数是x/2。
  2. 若x是奇数,则每次拿取2个硬币,直到只剩1个硬币,再拿走最后1个硬币即可,拿取次数是x/2+1。

统一以下,拿取次数是x/2+x%2或者(x+1)/2。

代码如下:

int minCount(int* coins, int coinsSize){
    int ret = 0;
    
    // 计算每一堆硬币最少拿几次,再求和
    for (int i = 0; i < coinsSize; ++i)
    {
        //ret += coins[i] / 2 + coins[i] % 2;
        ret += (coins[i] + 1) / 2;
    }

    return ret;
}

硬币之谜:如何用最少的步骤拿完所有硬币?_第2张图片
轻松通过。

总结

对于奇偶数分类讨论的情况,可以考虑取模,或者“加1后再除2”。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,算法,数据结构,力扣,c语言,leetcode)