【LeetCode】装满杯子需要的最短总时长Java题解

730 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

题目描述

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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
解释:每秒装满一杯冷水。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组题目,题目描述每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。题目思路比较清晰,我们优装满 2 杯 不同 类型水,1 杯任意类型的水。
  • 我们先将数组排序,设数量为 x,y,z。如果若 x + y ≤ z,显然每次用一个 z 和一个 x 或 y 匹配是最优的,消耗2杯水最优。答案就是 z。
  • 若 x + y > z, 假设超出部分是 t = x + y - z, 我们以消耗2杯水为优先,当 x + y = z 时候,答案是 t / 2 + z。实现代码如下,供参考。

通过代码

class Solution {
    public int fillCups(int[] amount) {
        int ans = 0;
        Arrays.sort(amount);

        if (amount[0] + amount[1] <= amount[2]) {
            ans = amount[2];
        } else {
            int t = amount[0] + amount[1] - amount[2];
            ans = (t + 1) / 2 + amount[2];
        }
        return ans;
    }
}

总结

  • 上述算法的题目时间复杂度是O(1), 空间复杂度是O(1)
  • 坚持算法每日一题,加油!