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

剑指 Offer II 073. 狒狒吃香蕉


comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20073.%20%E7%8B%92%E7%8B%92%E5%90%83%E9%A6%99%E8%95%89/README.md

剑指 Offer II 073. 狒狒吃香蕉

题目描述

狒狒喜欢吃香蕉。这里有 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 <= 10^4
    • piles.length <= H <= 10^9
    • 1 <= piles[i] <= 10^9

     

    注意:本题与主站 875 题相同: https://leetcode.cn/problems/koko-eating-bananas/

    解法

    方法一

    Python3
    
    from math import ceil
    class Solution:
        def minEatingSpeed(self, piles: List[int], h: int) -> int:
            # 二义性:在h小时内,吃不完,则增大速度;否则,减小速度
            def check(speed):
                tm=0
                for p in piles:
                    if speed>=p:tm+=1
                    else:
                        tm+=ceil(p/speed)
                return tm<=h
            
            left,right=1,max(piles) #left=2: piles =[312884470] h=31288446
            while left<=right:
                mid=(left+right)>>1
                if check(mid):
                    right=mid-1
                else:
                    left=mid+1
            return left
    
    Java
    class Solution {
        public int minEatingSpeed(int[] piles, int h) {
            int mx = 0;
            for (int pile : piles) {
                mx = Math.max(mx, pile);
            }
            int left = 1, right = mx;
            while (left < right) {
                int mid = (left + right) >>> 1;
                int s = 0;
                for (int pile : piles) {
                    s += (pile + mid - 1) / mid;
                }
                if (s <= h) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return left;
        }
    }
    
    C++
    class Solution {
    public:
        int minEatingSpeed(vector<int>& piles, int h) {
            int left = 1, right = *max_element(piles.begin(), piles.end());
            while (left < right) {
                int mid = left + right >> 1;
                int s = 0;
                for (int pile : piles) s += (pile + mid - 1) / mid;
                if (s <= h)
                    right = mid;
                else
                    left = mid + 1;
            }
            return left;
        }
    };
    
    Go
    func minEatingSpeed(piles []int, h int) int {
    	left, right := 1, slices.Max(piles)
    	for left < right {
    		mid := (left + right) >> 1
    		s := 0
    		for _, pile := range piles {
    			s += (pile + mid - 1) / mid
    		}
    		if s <= h {
    			right = mid
    		} else {
    			left = mid + 1
    		}
    	}
    	return left
    }
    
    C#
    public class Solution {
        public int MinEatingSpeed(int[] piles, int h) {
            int left = 1, right = piles.Max();
            while (left < right)
            {
                int mid = (left + right) >> 1;
                int s = 0;
                foreach (int pile in piles)
                {
                    s += (pile + mid - 1) / mid;
                }
                if (s <= h)
                {
                    right = mid;
                }
                else
                {
                    left = mid + 1;
                }
            }
            return left;
        }
    }
    
    Swift
    class Solution {
        func minEatingSpeed(_ piles: [Int], _ h: Int) -> Int {
            var left = 1
            var right = piles.max() ?? 0
    
            while left < right {
                let mid = (left + right) / 2
                var hours = 0
    
                for pile in piles {
                    hours += (pile + mid - 1) / mid
                }
    
                if hours <= h {
                    right = mid
                } else {
                    left = mid + 1
                }
            }
    
            return left
        }
    }
    

    相关文章:

  • 2025-03-13 禅修-错误的做法
  • 大白话如何在 Vue 项目中进行路由懒加载?
  • DexGraspVLA:面向通用灵巧抓取的视觉-语言-动作框架
  • 便利店商品推荐数字大屏:基于python和streamlit
  • python元组(被捆绑的列表)
  • 【C#学习笔记04】C语言格式化输出
  • 【Linux】线程
  • uniapp实现 uview1 u-button的水波纹效果
  • AI智能体系列文章:一、导论【Medium文章转载】
  • 基于SpringBoot和MybatisPlus实现通用Controller
  • 零售业务订单处理自动化:吉客云对接金蝶云星空
  • H5端vue3 SSR 项目报错小计
  • 深度学习优化-Gradient Checkpointing
  • 华为欧拉系统安装redis官网最新版
  • 【视频】ffmpeg、Nginx搭建RTMP、HLS服务器
  • 文件解析漏洞靶场集锦详解
  • 段错误解析
  • Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南
  • 深度剖析 Doris 数据倾斜,优化方案一网打尽
  • Docker Compose 之详解(Detailed Explanation of Docker Compose)
  • 做网站要学哪些程序/槐荫区网络营销seo
  • 日本做的视频网站有哪些问题吗/做网站推广公司
  • jsp网站开发 开题依据/兰州seo推广
  • 西宁高端网站制作公司/百度下载软件
  • 网站空间2G一年多少钱/网站域名服务器查询
  • 网站 备案/怎么做推广比较成功