LC2335. 装满杯子需要的最短总时长(JAVA)

265 篇文章 2 订阅
235 篇文章 0 订阅

装满杯子需要的最短总时长

题目描述

难度 - 简单
Leetcode - 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,能够凑出最多的2,因此我们可以先给三种水的数量排个序,每次用最多的两杯水去凑2。

代码演示

 public int fillCups(int[] amount) {
       Arrays.sort(amount);
       if(amount[1] == 0){
           return amount[2];
       }
       amount[1]--;
       amount[2]--;
       return 1 + fillCups(amount);
    }

在这里插入图片描述

数学法

还是和上面一样,主旨思想就是凑2.那么先给他排个序,求出最大值max,然后再求出总数量sum,如果最大值大于总和的二分之一,那么凑出的2肯定少于max,直接返回max 就行了,如果小于二分之一sum,那么就能凑出的2,就是 总和的一半,然后向上取整。

代码演示

  public int fillCups(int[] amount) {
        Arrays.sort(amount);
        int a = amount[0], b = amount[1], c = amount[2];
        if (a + b <= c) return c; 
        //加1 就是为了向上取整。       
        else return (a + b + c + 1) / 2;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值