美文网首页
IOS 算法(基础篇) ----- 装满杯子需要的最短总时长

IOS 算法(基础篇) ----- 装满杯子需要的最短总时长

作者: ShawnAlex | 来源:发表于2022-07-12 09:47 被阅读0次

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。
给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
amount.length == 3
0 <= amount[i] <= 100

例子

输入:amount = [1,4,2]
输出:4
解释:下面给出一种方案:
第 1 秒:装满一杯冷水和一杯温水。
第 2 秒:装满一杯温水和一杯热水。
第 3 秒:装满一杯温水和一杯热水。
第 4 秒:装满一杯温水。
可以证明最少需要 4 秒才能装满所有杯子。

输入:我amount = [5,4,4]
输出:7
解释:下面给出一种方案:
第 1 秒:装满一杯冷水和一杯热水。
第 2 秒:装满一杯冷水和一杯温水。
第 3 秒:装满一杯冷水和一杯温水。
第 4 秒:装满一杯温水和一杯热水。
第 5 秒:装满一杯冷水和一杯热水。
第 6 秒:装满一杯冷水和一杯温水。
第 7 秒:装满一杯热水。

输入:amount = [5,0,0]
输出:5
解释:每秒装满一杯冷水。

解题思路

稍微解释下概念

  • 贪心算法/贪婪算法: 在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。”

首先要有小到大, 因为乱序不好处理, 得到后的数组记: [a, b, c], 其中 a <= b <= c

  • a + b <= c: 直接返回c

    • 例如 [1, 2, 4], 1 + 2 < 4. a, b依次与c做调和, a,b 都被榨干了, c还有, 需要单独记秒, 所以最少秒数为c
  • a + b > c: 超出部分记 t = a + b - c
    a, b 先消耗多余部分, 其中

    • 偶数: t / 2
    • 奇数: (t + 1) / 2
    • a,b消耗完之后剩余场景 a1 + b1 <= c,即第一种判断, 直接返回c
    • 由于除法" / "是向下取整, 所以偶数也可以用 (t + 1) / 2,
    • 最终结果: (t + 1) / 2 + c

奇数可能不好理解, 举个例子: [4, 4, 5], 4 + 4 = 8 > 5, t = 8 - 5 = 3 因为3的话不好均分, 那么我多消耗一次 (t + 1) / 2 即 4 / 2 = 2

4, 4 先各自消耗 2 次, 剩余 [2, 2, 5], 那么就是5次, 最少秒数 2 + 5 = 7



其实我少一次也是一样的, 例如上面例子 (t - 1) / 2 = 1
4, 4 先各自消耗 1 次, 剩余 [3, 3, 5], 需要a1或b1单独消耗一次, 保证a + b = c, 那么最少秒数就有:

(t - 1) / 2 + 1 + c = t/2 - 1/2 + 1 + c = t/2 + 1/2 + c = (t + 1) / 2 + c

a + b > c场景, 最终结果: (t + 1) / 2 + c

代码

代码其实三行即可

    func fillCups(_ amount: [Int]) -> Int {

        var temp = amount.sorted()
        if temp[0] + temp[1] <= temp[2] { return temp[2] }
        return (temp[0] + temp[1] - temp[2] + 1) / 2 + temp[2]

    }

相关文章

  • IOS 算法(基础篇) ----- 装满杯子需要的最短总时长

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

  • 【教3妹学算法-每日3题(2)】装满杯子需要的最短总时长

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。[http...

  • 最短路(基础未优化)

    最短路(基础未优化) 写在前面 写最短路我犹豫了很久,因为最短路它涵盖的内容很多(四个基础算法),而且在基础算法上...

  • 时长最短

    昨晚17:55出发 历时两小时四十九分抵达了目的地 算是最快的一次从家到工作之地了 愿往后一切都如此顺顺利利 不堵...

  • 勇于空杯,时刻归零

    当杯子装满水,我们说这是水; 当杯子装满茶,我们说这是茶; 当杯子装满酒,我们说这是酒; 只有当杯子什么都不装,我...

  • iOS 动画基础总结篇

    iOS 动画基础总结篇 iOS 动画基础总结篇

  • iOS Object—c 面试基础复习整理 一

    iOS开发需要扎实的计算机基础知识,包括基础的算法和数据结构,常用设计模式,网络通信协议,数据安全;其次要求iOS...

  • IOS 算法(基础篇) ----- 基础索引

    今天分享一道基础中的基础算法题, 给大家分享一下 如果你想知道什么题? 既然你诚心诚意的发问了, 我就大发慈悲...

  • 2018-07-22

    最短路径算法之Dijkstra算法 基本思想 通过Dijstra计算图G中的最短路径时,需要指定起点s(即从顶点s...

  • 最短路径 之 Dijkstra 算法

    • 最短路径 之 Floyd 算法• 最短路径 之 Bellman 算法 Dijkstra算法是用于求解单源最短路...

网友评论

      本文标题:IOS 算法(基础篇) ----- 装满杯子需要的最短总时长

      本文链接:https://www.haomeiwen.com/subject/ozgobrtx.html