leetcode 2335. 装满杯子需要的最短总时长

113 阅读2分钟

1. 题目与解析

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。

给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。

输入: amount = [1,4,2]

输出: 4

解释: 下面给出一种方案:

第 1 秒:装满一杯冷水和一杯温水。

第 2 秒:装满一杯温水和一杯热水。

第 3 秒:装满一杯温水和一杯热水。

第 4 秒:装满一杯温水。

可以证明最少需要 4 秒才能装满所有杯子。

输入: amount = [5,4,4]

输出: 7

解释: 下面给出一种方案:

第 1 秒:装满一杯冷水和一杯热水。

第 2 秒:装满一杯冷水和一杯温水。

第 3 秒:装满一杯冷水和一杯温水。

第 4 秒:装满一杯温水和一杯热水。

第 5 秒:装满一杯冷水和一杯热水。

第 6 秒:装满一杯冷水和一杯温水。

第 7 秒:装满一杯热水。

输入: amount = [5,0,0]

输出: 5

解释: 每秒装满一杯冷水。

可以考虑使用贪心算法思考题解。一共只有三种水杯,每次饮水机最多可以为两杯不同类型的谁杯加水,因此,我们每次加水都选择目前情况下剩余的杯数最多的两个水杯类型进行加水,每一次模拟加水时答案增加一,最后的结果就是我们需要的。

另外,需要注意一个特殊的情况,当只剩一种类型的睡时,这个时候只能一杯一杯的加水,这种情况需要单独考虑。

2. 题解

class Solution {
    public int fillCups(int[] amount) {
        int ans = 0;
        Arrays.sort(amount);
        while (amount[2] != 0) {
            ans++;
            amount[2]--;
            if (amount[1] > 0) {
                amount[1]--;
            }
            Arrays.sort(amount);
        }

        return ans;

    }
}