难度:⭐
题目描述:
桌上有 n
堆力扣币,每堆的数量保存在数组 coins
中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
示例1:
1 | 输入:[4,2,1] |
示例2:
1 | 输入:[2,3,10] |
限制:
1 <= n <= 4
1 <= coins[i] <= 10
解题过程:
思路:
遍历n堆力扣币coins,对每一堆判断是否大于0,有则次数加1,币数减2循环计算。
c++代码:(执行用时0ms,击败100.00%,内存消耗8.4M,击败9.29%)
1 | class Solution { |
官方题解:
题意概述
有 n 堆硬币,每次从任意一堆拿走一枚或者两枚。问最少几次能够全部拿完。
题解
题目中虽然给了 n 堆硬币,但是最终每一堆都是要拿完的。而每一堆拿的情况又不影响其他硬币堆,因此每一堆硬币的拿法实际上是互相独立的。
于是我们可以只考虑一堆的情况。假设一堆有 x 枚硬币,既然我们的目的是尽早拿完所有硬币堆,那么两枚两枚的拿显然是更快的。
求单堆硬币最小次数:(x+1)//2
那么,拿完所有硬币堆只需要循环对所有硬币堆都计算一次,然后求和就可以了。
1 | class Solution: |
复杂度分析
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(n)$。
总结:
官方题解是python解法,用官方的思路c++实现跟我的代码效率也差不多!。