携手创作,共同成长!这是我参与「掘金日新计划 · 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)
- 坚持算法每日一题,加油!