写点什么

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

作者:Albert
  • 2022 年 7 月 10 日
  • 本文字数:940 字

    阅读完需:约 3 分钟

题目描述

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

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

Albert

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】装满杯子需要的最短总时长Java题解_LeetCode_Albert_InfoQ写作社区