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

我不是算法大佬,这里将会用最平民的方式解最常规的题单,这是算法开端的第一题。

力扣链接:装满杯子需要的最短总时长​​​​

 原题概要:

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。

给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。

凉热其实并不关心,主要的是水多水少的问题,所以先将水的数组排序: sort.Ints(amount)

这里的思路是先把多的水花光,然后慢慢花光前两杯水

数学思路:

如果amount[0] + amount[1] <= amount[2] 一共倒水amount[2]次

amount[0] + amount[1] > amount[2]

判断剩下的杯数 amount[0] + amount[1] - amount[2] 的奇偶

  • 偶数场景下,花光最后一杯水(amount[2])的时候,第一杯第二杯均分(amount[0] + amount[1] - amount[2])/2,共花费amount[2] + (amount[0] + amount[1] - amount[2])/2 次。化简后为 (amount[0] + amount[1] + amount[2])/ 2次
  • 奇数场景下,可能会涉及均分后多倒一次水,共花费amount[2] + (amount[0] + amount[1] - amount[2] + 1) / 2次。化简后为(amount[0] + amount[1] + amount[2] + 1)/ 2次

但是在语言环境中是默认取整的,所以可以通用为(amount[0] + amount[1] + amount[2] + 1)/ 2次,忽略奇偶场景。

模拟思路:

  1. 先把前两杯水配平(消费第二杯水到和第一杯水一样多),一共倒水amount[1] - amount[0]次水。
  2. 再把最多的水均匀的榨干,第一杯还剩下amount[0] - (amount[2] - (amount[1] - amount[0]) )/2)杯水,第二杯还剩下amount[1] - (amount[1] - amount[0]) - (amount[2] - (amount[1] - amount[0]) + 1)/2,第二杯剩下的杯数就是要倒水的次数。
  3. 一共倒水amount[2] + amount[1] - (amount[1] - amount[0]) - (amount[2] - (amount[1] - amount[0]) + 1))/2
  4. 化简:(amount[0] + amount[1] + amount[2] + 1)/ 2

代码如下:

import (
	"sort"
)

func fillCups(amount []int) int {
	sort.Ints(amount)
	if amount[0]+amount[1] < amount[2] {
		return amount[2]
	}
	return (amount[0] + amount[1] + amount[2] + 1)/ 2
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值