CSDN话题挑战赛第2期
参赛话题:学习笔记
题目链接:2335. 装满杯子需要的最短总时长
题目描述:
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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
解题思路:
每秒钟,可以装满2杯不同类型的水或者1杯任意类型的水
显然一直同时装不同类型的两杯水速度会更快
有两种情况:
1、其中一种水杯数大于另外两种杯数的和,则结果就是装满该种水的时间
2、其他情况下,则每次都装最多的那两杯
变量time记录时间,直接 Arrays.sort(amount) 对水进行排序
判断最大杯数是否大于前两种杯数的和,若是直接返回最大杯数
判断中间杯数是否大于0,若是则第2第3各减1杯,time++,再次对水进行排序后,重复该步判断流程
最后判断是否只剩下一种水,存在则返回该水数量加当前时间数,否则返回time
解题代码:
class Solution {
public int fillCups(int[] amount) {
int time = 0; // 记录时间数
Arrays.sort(amount); // 进行排序
if(amount[2] >= amount[1] + amount[0]) return time + amount[2]; // 若存在其中一种水杯数大于另外两种杯数和,直接返回该种水的杯数
while(amount[1] > 0){
// 若至少还有2种水没装完,装最多的那两杯
amount[1]--;
amount[2]--;
++time;
Arrays.sort(amount);
}
if(amount[2] > 0) return amount[2] + time; // 最后如果只剩一种水,则直接加上当前时间数
return time;
}
}