算法 - 递归 数学分析 - 2335. 装满杯子需要的最短总时长 详细解析

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

文章目录

  • [2335. 装满杯子需要的最短总时长](https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/description/)
    • 说明
    • 题解思路
      • 简单模拟 + 递归
      • 数学分析
    • Code
      • 简单模拟 + 递归
      • 数学分析

说明

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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杯水
  • 那么就可以转化为:尽量每次倒两种水,需要的时间

简单模拟 + 递归

  • 尽量每次倒两种水,需要的时间
  • 那么每次倒所需最多的次多的两种,最后如果有余那么加上这个时间
  • 按照题意模拟:
    • 每次先对数组进行排序
    • 如果仅有一种水的需求了,那么就返回这个需求的数量
    • 否则将最多的和次多的各减一
    • 操作数加一进行递归
  • 数组长度固定为 3 ,所以排序的时间复杂度为 O(1)
  • 最终时间复杂度仅取决于amount[n]的大小,为 O(n)
  • 空间复杂度为 O(1)

数学分析

  • 细看题目,实际上这个问题可以通过数学的方式来求解
  • 设定需求最多的水数量为 c , 次多的水数量为 b ,最少的水数量为 a
    • 如果 c >= a + b ,那么每次倒c水的时候,都能带走一杯 a 或者 b ,最终加上 c 的剩余即为最优的用时
      • 那就是每次都倒 c 的水,有 ab 的时候带上倒,没了就只倒 c ,最终的用时就是倒完 c 的时间
      • 最优的耗时就是 c的值
    • 如果 c < a + b
      • 这个情况的最优策略就取决于 a + bc 的差值 tt = a + b - c
        • 因为如果将在 t/2 的时间内,将 ab 合起来倒掉 t 杯水,那么问题就转化成了上面的c >= a + b,最优时间为 c
      • 现在就需要证明在 t/2 的时间内,能不能将 ab 合起来倒掉 t 杯水,这取决于 a 是否大于等于 t/2
      • 反证法:
        • 假设 a < t/2
        • => t < t/2 + b - c
        • => t/2 < b - c
        • 因为 b < c ,且t一定大于0,假设显然不成立
        • 那么就能证明 a 一定大于等于 t/2
      • 需要的时间就是先用 t/2 的时间将问题转化为 c >= a + b 的情况
      • 最终耗时:t/2 + c => (a + b - c)/2 + c
      • 实现需要考虑奇偶,所以为(a + b - c + 1)/2 + c
  • 时间复杂度为 O(1)
  • 空间复杂度为 O(1)

Code

简单模拟 + 递归

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

数学分析

class Solution {
    public int fillCups(int[] amount) {
        Arrays.sort(amount);
        int a = amount[0], b = amount[1], c = amount[2];
        if (a + b <= c) return c;
        return (a + b - c + 1) / 2 + c;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/573121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搞嵌入式到底属于程序员吗?

搞嵌入式到底属不属于程序员呢&#xff1f;毫无疑问&#xff0c;当然算啊&#xff01;而且我十分赞同另一位朋友所说的&#xff1a;嵌入式程序员是难得的全栈型程序员。尽管嵌入式领域方向众多且繁杂&#xff0c;但他们同样也是会写代码的程序员。 嵌入式行业主要分为硬件和软…

《从零开始的Java世界》11网络编程

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

打开IIS网站网页错误提示Argument ‘Key must not be null‘ cannot be null.解决方案 Oracle数据库监听

打开网页异常如下&#xff1a; /“应用程序中的服务器错误。 Argument Key must not be null cannot be null.参数名:Key must not be null 客户端 连接oracle 提示&#xff1a;ORA-12541:TNS:无监听程序 按组合键WindowsR&#xff0c;打开运行 输入命令&#xff1a;lsnrctl s…

周报不止是汇报进度,如何用周报轻松提升团队协作效率?

周报是工作中常见的沟通工具&#xff0c;对于项目经理来说尤其重要。写周报不仅仅是为了完成一项任务&#xff0c;它更是项目管理中不可或缺的环节&#xff0c;它不仅有助于项目经理跟踪项目进度&#xff0c;还加强了团队成员间的沟通与协作。以下是几个关键的原因&#xff1a;…

Geoserver的RESTful接口使用

概述 GeoServer提供了一个RESTful接口&#xff0c;客户端可以通过该接口获取有关实例的信息并进行配置更改。REST接口使用简单的HTTP调用&#xff0c;通过客户端就可以配置GeoServer&#xff0c;而无需使用Web管理接口。 Geoserver中的关系 工作区、数据源、图层、图层组以及…

用 LMDeploy 高效部署 Llama-3-8B,1.8倍vLLM推理效率

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

微信小程序Vue+nodejs+uniapp课堂教学辅助在线学习系统

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 后台主要实现功能&#xff1a;一、用户的管理(用户的信息管理) 二、 课程的管理&#xff08;课程发布&#xff0c;课后成绩的查看&#xff0c…

【C语言__联合和枚举__复习篇10】

目录 前言 一、联合体 1.1 联合体的概念 1.2 联合体与结构体关于声明和内存布局的比较 1.3 联合体的大小如何计算 1.4 使用联合体的2个示例 二、枚举体 2.2 枚举体的概念 2.2 枚举体的优点 前言 本篇主要讨论以下问题&#xff1a; 1. 联合体是什么&#xff0c;它有什么特点 …

每天一题crypto(1)---RSA(小明文攻击)

零.做题&#xff1a; 看到N很大&#xff0c;如果满足 就表示模过程中&#xff0c;没有丢失信息&#xff0c;所以 直接解即可&#xff0c;不要管pq等等 一.题目&#xff1a; N很大 from Crypto.Util.number import * from gmpy2 import *flag bNSSCTF{******}p getPrime(5…

【SpringBoot整合系列】SpringBoot配置多数据源

目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意&#xff1a;Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的ma…

防火墙分为哪三类以及他们的优缺点

1. 包过滤防火墙&#xff08;Packet Filtering Firewall&#xff09;2. 状态检查防火墙&#xff08;Stateful Inspection Firewall&#xff09;3. 应用层防火墙&#xff08;Application Layer Firewall&#xff09;零基础入门学习路线视频配套资料&国内外网安书籍、文档网络…

Spring Cloud Alibaba Sentinel 使用

初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址&#xff1a; home | Sentinel 需要了解的概念 簇点链路 在学习 Sentinel 的使用之前&#xff0c;我们有必要首先了解一下簇点链路。当请求进入微服务时&#xff0c;首先会访Controller、Service、Ma…

C++11可变模板参数

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

百面算法工程师 | 卷积基础知识——Convolution

目录 8.1 图像卷积过程 8.2 卷积层基本参数 8.3 卷积后图像的长和宽大小的计算方式 8.4 卷积神经网络中的权重共享 8.5 上采样中的反卷积 8.6 空洞卷积 8.7 深度可分离卷积 8.8 为什么可分离卷积中Depthwise卷积后还要进行pointwise卷积 8.9 分组卷积 Group Conv 8.1…

前端导入的方便方法

直接上代码&#xff1a; 利用input的导入功能 这是相应的处理方法 是不是很简单呢

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-01-软件架构演化概述

文章目录 1. 演化的重要性2. 架构演化示例 教材中&#xff0c;本节名为&#xff1a;“软件架构演化和定义的关系” 1. 演化的重要性 演化目的&#xff1a;维持软件架构自身的有用性 为什么说&#xff0c;软件架构是演化来的&#xff0c;而不是设计来的&#xff1f; 软件架构的…

【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令&#xff0c;直到特定的条件被满足为止。这重复执行的一组指令就叫做循环 特点&#xff1a; 首先&#xff0c;循环条件中使用的变量必须是已初始化的&#xff0c;然后在循环中开始执行每次在循环开始时进行一次测试重复地执行一个代码块 循环实例…

SD-WAN怎样提高企业网络体验

随着数字化转型的加速&#xff0c;传统基于MPLS的专用网络因其高度的结构化和僵化性&#xff0c;已无法满足现代企业对于灵活性和成本效益的日益增长的需求。相比之下&#xff0c;SD-WAN作为一种创新的网络架构&#xff0c;正以其卓越的性能和灵活的管理方式&#xff0c;成为企…

服务于金融新核心系统 星辰天合与中电金信完成产品兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY星辰天合&#xff09;与中电金信软件有限公司&#xff08;简称&#xff1a;中电金信&#xff09;完成产品兼容性认证&#xff0c;星辰天合的企业级分布式统一数据平台 XEDP 符合金融级数字底座&q…

ECG-Emotion Recognition(情绪识别)-- 数据集介绍WESADDREAMER

1、WESAD数据集 下载链接&#xff1a;WESAD: Multimodal Dataset for Wearable Stress and Affect Detection | Ubiquitous Computing &#xff08;1&#xff09;基本介绍 WESAD是一个用于可穿戴压力和影响检测的新的公开数据集。该多模式数据集以实验室研究期间15名受试者的生…