当前位置: 首页 > news >正文

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分钟”的贪心策略,快速判断候选时间是否可行;
  • 该方法高效解决了“最大化同时运行时间”的问题,避免了暴力枚举的高时间复杂度。
http://www.jsqmd.com/news/674626/

相关文章:

  • Pandas的基本操作
  • 如何快速构建Hackintosh:OpCore-Simplify终极配置指南
  • Legacy iOS Kit完整指南:旧设备降级与越狱终极教程
  • C语言手把手实现最小二乘法曲线拟合(附与Matlab对比测试)
  • 哇!牛!快来报名“香港科大-哇牛”2026[人工智能]百万奖金国际创业大赛!!!
  • 注意力机制模块:针对浅层网络设计的注意力:结合 ParNet 思想提升 YOLO 颈部多尺度特征融合
  • 如何快速使用Devices.css创建精美的设备展示:面向初学者的完整指南
  • c++知识点2
  • 如何快速构建黑苹果EFI:OpCore-Simplify终极指南
  • 在统信UOS上,用达梦8数据库替换MySQL的完整迁移与配置指南(含性能对比)
  • 避坑指南:Livox_ros_driver的点云数据,为什么你的标定/算法代码读不了?
  • HTML头部元信息必知避坑指南
  • 测试功能指南 富文本
  • 如何使用go-torch在5分钟内创建你的第一个Go性能火焰图
  • EaseProbe SSH远程探测:支持堡垒机和密钥认证的终极服务器监控方案
  • EcomGPT-7B多语言模型实战:用同一模型服务中国工厂(中文)与海外买家(英文)
  • 谷歌不收录怎么办? 改掉这4个排版坏习惯,收录率直接
  • 如何快速掌握Vue.js技术:从原理到实践的终极指南
  • ECharts饼图内外双标签显示实战:一个‘笨’方法解决产品经理的‘奇葩’需求
  • Java抽象类深度解析(面试必备)
  • 注意力机制模块:2026大厂主流套路:借鉴 EfficientViT 的级联群体注意力(CGA)替换传统自注意力模块
  • DeepSeek-R1-Distill-Qwen-1.5B入门指南:如何用官方tokenizer.apply_chat_template拼接多轮对话
  • Overleaf平台gbt7714参考文献排版完全指南:从问题排查到完美解决
  • Pixel Dream Workshop惊艳效果展示:动态像素粒子系统与GIF导出能力
  • 第5章,[标签 Win32] :设备环境
  • R 4.5回测精度跃迁至毫秒级:基于xts 0.13+和nanotime的Tick级重采样方案(附NASA级测试数据集)
  • ESP32 BLE通信提速秘籍:手把手教你设置MTU,让数据传输快人一步
  • 谷歌地图排名怎么做?本地商户搜索进店率翻倍的18个细节
  • 为什么企业做了多年数字化,还是停留在表面?——从“工具堆砌”到“Agent原生”的深度解构与实战破局
  • 如何高效实现InstantSearch路由管理:构建复杂搜索导航的完整指南