news 2025/12/14 10:15:54

day121—二分查找—爱吃香蕉的珂珂(LeetCode-875)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day121—二分查找—爱吃香蕉的珂珂(LeetCode-875)

题目描述

珂珂喜欢吃香蕉。这里有n堆香蕉,第i堆中有piles[i]根香蕉。警卫已经离开了,将在h小时后回来。

珂珂可以决定她吃香蕉的速度k(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k根。如果这堆香蕉少于k根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在h小时内吃掉所有香蕉的最小速度kk为整数)。

示例 1:

输入:piles = [3,6,7,11], h = 8输出:4

示例 2:

输入:piles = [30,11,23,4,20], h = 5输出:30

示例 3:

输入:piles = [30,11,23,4,20], h = 6输出:23

提示:

  • 1 <= piles.length <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

解决方案:

算法目标

找出Koko每小时吃香蕉的最小速度k,使得她能在h小时内吃完所有香蕉堆。

核心思路

  1. 确定查找范围:速度k[1, 最大香蕉堆]之间

  2. 二分查找:尝试不同的速度,找到满足条件的最小速度

  3. 验证可行性:对每个尝试的速度,计算吃完所有香蕉需要的时间

算法步骤

1. 确定二分查找范围

int max_p = 0; for(auto p : piles) { max_p = max(max_p, p); } int left = 0; // 不可行的下界 int right = max_p + 1; // 可行的上界(开区间)
  • 最小速度:1(每小时至少吃1根)

  • 最大速度:最大香蕉堆的大小(一次吃完一堆)

  • 使用开区间(left, right)left永远不可行,right永远可行

2. 二分查找主循环

while(left + 1 < right) { int mid = left + (right - left) / 2; // 尝试的速度 // 计算以速度mid需要的时间 // 判断并更新边界 }

3. 计算所需时间

int tmp_hour = 0; for(auto p : piles) { tmp_hour += (p + mid - 1) / mid; // 向上取整 if(tmp_hour > h) break; // 提前退出优化 }
  • 对每堆香蕉p,计算需要的小时数:ceil(p / mid)

  • 使用整数向上取整技巧:(p + mid - 1) / mid

  • 累加总时间

  • 提前退出:如果已超过h小时,立即停止计算

4. 判断并更新边界

if(tmp_hour > h) { left = mid; // 速度太慢,不可行 } else { right = mid; // 速度可行,尝试更小的 }

5. 返回结果

return right; // 最小的可行速度

关键点

  • 二分查找对象:吃香蕉的速度k,不是数组索引

  • 验证条件:以速度k吃完所有香蕉的时间≤ h

  • 搜索方向:寻找满足条件的最小k

  • 边界处理:使用开区间确保正确性

时间复杂度

  • 寻找最大值:O(n)

  • 二分查找:O(log M),M为最大香蕉堆大小

  • 每次验证:O(n)

  • 总时间:O(n log M)

示例

piles = [3,6,7,11] h = 8 查找过程: 1. 范围: k ∈ [1, 11] 2. 尝试 k=6: 需要6小时 ≤ 8 → 可行 3. 尝试 k=3: 需要10小时 > 8 → 不可行 4. 尝试 k=4: 需要8小时 ≤ 8 → 可行 5. 尝试 k=5: 需要8小时 ≤ 8 → 可行 6. 最终结果: k=4

函数源码:

class Solution { public: int minEatingSpeed(vector<int>& piles, int h) { int max_p=0; for(auto p:piles){ max_p=max(max_p,p); } int left=0; int right=max_p+1; while(left+1<right){ int mid=(right+left)/2; int tmp_hour=0; for(auto p:piles){ tmp_hour+=(p+mid-1)/mid; if(tmp_hour>h) break; } if(tmp_hour>h) left=mid; else right=mid; } return right; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/11 16:46:06

如何利用Wan2.2-T2V-A14B提升广告视频产出效率300%

如何用Wan2.2-T2V-A14B把广告视频生产效率拉满300%&#xff1f;&#x1f680; 你有没有经历过这样的场景&#xff1a; 市场部急着要5条新品推广视频&#xff0c;明天就要上线&#xff1b; 摄影师档期排到下周&#xff0c;剪辑师还在赶双11的素材&#xff1b; 最后只能拿PPT转场…

作者头像 李华
网站建设 2025/12/11 16:45:44

Wan2.2-T2V-A14B如何生成带有健康码变色效果的通行管理视频?

Wan2.2-T2V-A14B如何生成带有健康码变色效果的通行管理视频&#xff1f; 在地铁闸机前&#xff0c;一名乘客走近——口罩遮面&#xff0c;手机亮屏&#xff0c;绿码清晰。红外测温仪“滴”一声扫过额头&#xff0c;温度跳至38.2℃。几乎瞬间&#xff0c;他手中的健康码开始泛红…

作者头像 李华
网站建设 2025/12/11 16:45:41

24大数据 15-2 线性查找和选择排序

15-2 12.11 def binary_search(arr, target):left 0right len(arr) - 1while left < right:mid (left right) // 2if arr[mid] target:return mid # 找到了&#xff0c;返回索引elif arr[mid] < target:left mid 1 # 目标在右边else:right mid - 1 # 目标在左…

作者头像 李华
网站建设 2025/12/11 16:45:40

5分钟搞定专业歌词!MusicFreeDesktop新手必学的歌词制作技巧

5分钟搞定专业歌词&#xff01;MusicFreeDesktop新手必学的歌词制作技巧 【免费下载链接】MusicFreeDesktop 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreeDesktop 你是否曾经遇到过这样的困扰&#xff1a;下载的LRC歌…

作者头像 李华
网站建设 2025/12/11 16:45:33

langgraph父子图构建

一.背景LangGraph 作为 LangChain 生态中专注于大模型应用流程编排与多智能体协作的核心框架&#xff0c;其核心能力是将复杂业务流程抽象为可视化的有向图&#xff08;StateGraph&#xff09;&#xff0c;支持节点执行、状态流转与分支决策。但在企业级复杂场景中&#xff0c;…

作者头像 李华
网站建设 2025/12/11 16:45:29

【毕业设计】SpringBoot+Vue+MySQL 医院病历管理系统平台源码+数据库+论文+部署文档

摘要 随着信息技术的快速发展&#xff0c;医疗行业正逐步向数字化、智能化转型。传统的纸质病历管理方式存在效率低下、易丢失、查询不便等问题&#xff0c;难以满足现代医院高效运营的需求。电子病历管理系统通过信息化手段优化病历存储、检索和共享流程&#xff0c;提升医疗服…

作者头像 李华