题目描述
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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
思路
可以使用贪心的思路解决:每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水,要返回装满所有杯子所需的最少秒数,那么我们尽量就是要让每1秒都装满2杯水。
思考1秒钟只能装1杯的情况:只剩下某1种水,剩余k杯。我们要尽量避免这种情况发生,所以我们的策略为,初始3种水都有的时候,我们每1秒就要装数量较多的2种水,这样会最大程度避免只剩下1种水的情况,正常来说,我们这样装之后,需要的描述就是 (sum+1)/2,但是如果最多的1种水超过一半,那么我们每秒钟都装这1种+任意另一种后,最后总是还会剩下最多的这种水,即这种情况下,装完的秒数完全取决于最多这种水的数量。
Java版本代码
class Solution {
public int fillCups(int[] amount) {
int sum = Arrays.stream(amount).sum();
int max = Arrays.stream(amount).max().getAsInt();
if (max > sum / 2) {
return max;
}
return (sum + 1) / 2;
}
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情