赞
踩
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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
3
,所以排序的时间复杂度为 O(1)
amount[n]
的大小,为 O(n)
O(1)
c
, 次多的水数量为 b
,最少的水数量为 a
c >= a + b
,那么每次倒c
水的时候,都能带走一杯 a
或者 b
,最终加上 c
的剩余即为最优的用时
c
的水,有 a
有 b
的时候带上倒,没了就只倒 c
,最终的用时就是倒完 c
的时间c
的值c < a + b
a + b
与 c
的差值 t
,t = a + b - c
t/2
的时间内,将 a
与 b
合起来倒掉 t
杯水,那么问题就转化成了上面的c >= a + b
,最优时间为 c
t/2
的时间内,能不能将 a
与 b
合起来倒掉 t
杯水,这取决于 a
是否大于等于 t/2
a < t/2
t < t/2 + b - c
t/2 < b - c
b < c
,且t
一定大于0
,假设显然不成立a
一定大于等于 t/2
t/2
的时间将问题转化为 c >= a + b
的情况t/2 + c
=> (a + b - c)/2 + c
(a + b - c + 1)/2 + c
O(1)
O(1)
class Solution {
public int fillCups(int[] amount) {
Arrays.sort(amount);
if(amount[1] == 0) return amount[2];
amount[2]--;
amount[1]--;
return 1 + fillCups(amount);
}
}
class Solution {
public int fillCups(int[] amount) {
Arrays.sort(amount);
int a = amount[0], b = amount[1], c = amount[2];
if (a + b <= c) return c;
return (a + b - c + 1) / 2 + c;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。