news 2026/4/21 3:49:14

LeetCode 每日一题笔记 日期:2025.12.01 题目:2141.同时运行 N 台电脑的最长时间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 每日一题笔记 日期:2025.12.01 题目:2141.同时运行 N 台电脑的最长时间

LeetCode 每日一题笔记

0. 前言

  • 日期:2025.12.01
  • 题目:2141.同时运行 N 台电脑的最长时间
  • 难度:困难
  • 标签:数组 二分查找 贪心

1. 题目理解

问题描述
n台电脑,给定整数数组batteries(第i个电池可让一台电脑运行batteries[i]分钟)。初始时每台电脑最多连一个电池,之后可随时断开/连接电池(无时间消耗)。要求让全部n台电脑同时运行,返回最长运行分钟数。

示例

示例 1:
输入:n = 2, batteries = [3,3,3]
输出:4
解释:总电池容量 9,2台电脑同时运行的理论最大时间为 9/2=4.5,实际可运行 4 分钟(每个电池贡献 3 分钟,总和 9 ≥ 2×4=8)。

示例 2:
输入:n = 3, batteries = [10,10,3,5]
输出:8
解释:总容量 28,理论最大 28/3≈9.33,实际验证 8 分钟可行(各电池贡献 8、8、3、5,总和 24 ≥ 3×8=24)。

2. 解题思路

核心观察

  • 若要让n台电脑同时运行T分钟,总能耗为n×T,需满足所有电池的有效贡献总和 ≥ n×T
  • 每个电池的有效贡献为min(电池容量, T)(电池最多为某台电脑提供T分钟电量)。

算法步骤

  1. 二分范围确定

    • 左边界left = 0(最小运行时间);
    • 右边界right = 总电池容量 / n(理论最大运行时间,总能耗不能超过总电池容量)。
  2. 二分查找

    • 取中间值mid作为候选运行时间;
    • 验证mid是否可行(计算所有电池的有效贡献总和,判断是否 ≥ n×mid);
    • 若可行,记录mid并尝试更大时间(右移左边界);
    • 若不可行,尝试更小时间(左移右边界)。

3. 代码实现

classSolution{publiclongmaxRunTime(intn,int[]batteries){// 计算所有电池总容量(用long避免溢出)longsum=0;for(intb:batteries)sum+=b;// 二分查找的范围longleft=0,right=sum/n;longans=0;while(left<=right){longmid=(left+right)/2;// 验证mid分钟是否可行if(check(mid,n,batteries)){ans=mid;// 记录可行的最大时间left=mid+1;// 尝试更大时间}else{right=mid-1;// 尝试更小时间}}returnans;}// 验证函数:判断是否能让n台电脑同时运行T分钟privatebooleancheck(longT,intn,int[]batteries){longtotal=0;for(intb:batteries){total+=Math.min(b,T);// 每个电池最多贡献T分钟if(total>=n*T)returntrue;// 提前终止,节省时间}returntotal>=n*T;}}

4. 代码优化说明

优化版将验证逻辑内联到二分循环中,减少函数调用开销(仅逻辑合并,核心思路不变):

classSolution{publiclongmaxRunTime(intn,int[]batteries){longsum=0;for(intcap:batteries){sum+=cap;}longleft=0,right=sum/n,ans=0;while(left<=right){longmid=left+(right-left)/2;// 避免left+right溢出longtotal=0;for(intcap:batteries){total+=Math.min(cap,mid);}if(total>=n*mid){ans=mid;left=mid+1;}else{right=mid-1;}}returnans;}}

5. 复杂度分析

  • 时间复杂度:(O(m \times \log(\text{sum}/n)))

    • m是电池数量,每次验证需遍历所有电池((O(m)));
    • 二分查找的次数为 (\log(\text{sum}/n))(sum为总电池容量)。
  • 空间复杂度:(O(1))

    • 仅使用常量级额外空间。

6. 总结

  • 核心思路是二分查找 + 贪心验证:通过二分缩小运行时间的候选范围,用贪心计算电池有效贡献来验证可行性;
  • 关键技巧是利用“每个电池最多贡献T分钟”的贪心策略,快速判断候选时间是否可行;
  • 该方法高效解决了“最大化同时运行时间”的问题,避免了暴力枚举的高时间复杂度。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 3:46:38

新都N418复印机更换新主板主板的调试教程

1、首先打开复印机的后盖进行更换新主板&#xff0c;一般情况下并不需要把旧主板上的八角芯片安装到新主板上&#xff0c;新主板上的八角芯片可以使用&#xff0c;新都N418复印机初始密码&#xff1a;sindoh#1232、进行开机进入复印机系统&#xff0c;然后进维修模式——按“停…

作者头像 李华
网站建设 2026/4/21 3:46:36

如何快速配置思源宋体:免费开源中文字体的完整使用指南

如何快速配置思源宋体&#xff1a;免费开源中文字体的完整使用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 思源宋体是一款由Adobe和Google联合开发的完全开源免费商用中文字体…

作者头像 李华
网站建设 2026/4/21 3:45:45

用STM32F405RGT6和CubeMX搞定双电机编码器测速:从配置到转速计算的完整流程

STM32F405双编码器测速实战&#xff1a;CubeMX配置与精准转速计算全解析 在机器人关节控制、无人机云台稳定系统以及工业自动化设备中&#xff0c;双电机同步控制是一个常见但颇具挑战性的需求。当两个电机需要协同工作时&#xff0c;实时获取它们的转速信息是构建闭环控制系统…

作者头像 李华
网站建设 2026/4/21 3:44:45

C语言手把手实现最小二乘法曲线拟合(附与Matlab对比测试)

C语言实战&#xff1a;从零构建最小二乘法曲线拟合引擎 在嵌入式系统和资源受限环境中&#xff0c;开发者常常面临一个棘手问题&#xff1a;如何在不依赖商业数学软件的情况下实现高精度曲线拟合&#xff1f;我曾在一个工业传感器项目中&#xff0c;因为无法使用Matlab而不得不…

作者头像 李华
网站建设 2026/4/21 3:44:44

HTML头部元信息必知避坑指南

HTML头部元信息避坑指南元信息基础概念定义与作用&#xff1a;<head>标签内元信息的核心功能&#xff08;SEO、渲染控制、兼容性等&#xff09;。常见类型&#xff1a;<meta>、<title>、<link>、<script>等标签的分类说明。字符编码声明必须优先…

作者头像 李华
网站建设 2026/4/21 3:43:33

zsh-z故障排除:常见问题与解决方案大全

zsh-z故障排除&#xff1a;常见问题与解决方案大全 【免费下载链接】zsh-z Jump quickly to directories that you have visited "frecently." A native Zsh port of z.sh with added features. 项目地址: https://gitcode.com/gh_mirrors/zs/zsh-z zsh-z是一…

作者头像 李华