Leetcode-LCP006-拿硬币

Leetcode-LCP006-拿硬币

题目描述

  • 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
连分数是形如上图的分式。在本题中,所有系数都是大于等于0的整数。

输入的cont代表连分数的系数(cont[0]代表上图的a0,以此类推)。返回一个长度为2的数组[n, m],使得连分数的值等于n / m,且n, m最大公约数为1。


示例 1:
输入:[4,2,1]
输出:4
解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。


示例 2:
输入:[2,3,10]
输出:8
  • 提示:
    • 1 <= n <= 4
    • 1 <= coins[i] <= 10

算法思路:模拟

  • 有 n 堆硬币,每次从任意一堆拿走一枚或者两枚。问最少几次能够全部拿完。

  • 题目中虽然给了 n 堆硬币,但是最终每一堆都是要拿完的。而每一堆拿的情况又不影响其他硬币堆,因此每一堆硬币的拿法实际上是互相独立的

  • 于是我们可以只考虑一堆的情况。

    • 假设一堆有 x 枚硬币,既然我们的目的是尽早拿完所有硬币堆,那么两枚两枚的拿显然是更快的。
    • 求单堆硬币最小次数:(x+1)//2
  • 那么,拿完所有硬币堆只需要循环对所有硬币堆都计算一次,然后求和就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int minCount(int[] coins) {
// 1. 统计需要的次数
int count = 0;

// 2. 每堆硬币拿走的次数为(coin + 1) //2
for(int coin: coins){
count += (coin + 1) >> 1;
}
return count;
}
}

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n*)。
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信