关于javascript:leetcode2335-装满杯子需要的最短总时长

41次阅读

共计 1028 个字符,预计需要花费 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
解释:每秒装满一杯冷水。

提醒:

amount.length == 3
0 <= amount[i] <= 100

解决思路:

设 abc 按序列排
如果 c >a+b 返回 c
如果 c <a+b 返回(a+b-c)/2+c 如果是小数 要进一

为什么 c >a+b 返回 c?

c 是最大数量水杯,并且大于 a +b,那么最佳策略当然是 A 和 B 别离和 C 一起灌水,最初 C 残余的局部再独自装。这种状况的答案就是 C。

为什么 c <a+b 返回(a+b-c)/2+c 如果是小数 要进一

如果相差的并没有这么大,要尽量保障 A 和 B 残余的容积尽可能雷同,这样的话,咱们就能够在装满 C 之后,同时装 A 和 B
把 C 装满时装入 A 和 B 的水也是 C,A 和 B 残余要装的水量是 A +B-C,尽量均匀地调配在 A 和 B 两个杯子中,所以残余的工夫就是 (A+B-C)/2
而后再加上本来 c 杯水的工夫

代码

/**
 * @param {number[]} amount
 * @return {number}
 */
var fillCups = function(amount) {function methodSort(a,b){return a-b;}
amount=amount.sort(methodSort)
if(amount[0]+amount[1]<amount[2]){return amount[2]
}else{return Math.ceil((amount[0]+amount[1]-amount[2])/2)+amount[2]
}
};

正文完
 0