2335. 装满杯子需要的最短总时长
题目描述
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2
杯 不同 类型的水或者 1
杯任意类型的水。
给你一个下标从 0 开始、长度为 3
的整数数组 amount
,其中 amount[0]
、amount[1]
和 amount[2]
分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
示例 1:
输入:amount = [1,4,2] 输出:4 解释:下面给出一种方案: 第 1 秒:装满一杯冷水和一杯温水。 第 2 秒:装满一杯温水和一杯热水。 第 3 秒:装满一杯温水和一杯热水。 第 4 秒:装满一杯温水。 可以证明最少需要 4 秒才能装满所有杯子。
示例 2:
输入:amount = [5,4,4] 输出:7 解释:下面给出一种方案: 第 1 秒:装满一杯冷水和一杯热水。 第 2 秒:装满一杯冷水和一杯温水。 第 3 秒:装满一杯冷水和一杯温水。 第 4 秒:装满一杯温水和一杯热水。 第 5 秒:装满一杯冷水和一杯热水。 第 6 秒:装满一杯冷水和一杯温水。 第 7 秒:装满一杯热水。
示例 3:
输入:amount = [5,0,0] 输出:5 解释:每秒装满一杯冷水。
提示:
amount.length == 3
0 <= amount[i] <= 100
解法
方法一:贪心 + 排序
我们可以每次贪心地选择其中较大的两个数进行减一操作(最多减为 \(0\)),直至所有数变为 \(0\)。
时间复杂度 \(O(S)\),空间复杂度 \(O(1)\)。其中 \(S\) 为数组 amount
中所有数的和,本题中 \(S \leq 300\)。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 |
|
方法二:贪心 + 分类讨论
我们可以将数组 amount
排序,设 \(a\), \(b\), \(c\) 分别为数组 amount
中的三个数,有以下两种情况:
- 如果 \(a + b \leq c\),此时我们只需要 \(c\) 次操作即可将所有数变为 \(0\),因此答案为 \(c\)。
- 如果 \(a + b > c\),每一次操作我们都可以将其中两个数减一,最终匹配完,或者剩下最后一个数(取决于总和是偶数还是奇数),因此答案为 \(\left \lfloor \frac{a + b + c + 1}{2} \right \rfloor\)。
时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)。
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 |
|