每日一题 | 力扣刷题 [2335. 装满杯子需要的最短总时长]——java

发布于:2022-12-07 ⋅ 阅读:(722) ⋅ 点赞:(0)

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;
    }
}

提交结果:

本文含有隐藏内容,请 开通VIP 后查看