返回介绍

solution / 0800-0899 / 0875.Koko Eating Bananas / README

发布于 2024-06-17 01:03:33 字数 3936 浏览 0 评论 0 收藏 0

875. 爱吃香蕉的珂珂

English Version

题目描述

珂珂喜欢吃香蕉。这里有 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

    解法

    方法一:二分查找

    二分枚举速度值,找到能在 $h$ 小时内吃完所有香蕉的最小速度值。

    时间复杂度 $O(n\log m)$,空间复杂度 $O(1)$。其中 $n$ 是 piles 的长度,而 $m$ 是 piles 中的最大值。

    class Solution:
      def minEatingSpeed(self, piles: List[int], h: int) -> int:
        left, right = 1, int(1e9)
        while left < right:
          mid = (left + right) >> 1
          s = sum((x + mid - 1) // mid for x in piles)
          if s <= h:
            right = mid
          else:
            left = mid + 1
        return left
    
    class Solution {
      public int minEatingSpeed(int[] piles, int h) {
        int left = 1, right = (int) 1e9;
        while (left < right) {
          int mid = (left + right) >>> 1;
          int s = 0;
          for (int x : piles) {
            s += (x + mid - 1) / mid;
          }
          if (s <= h) {
            right = mid;
          } else {
            left = mid + 1;
          }
        }
        return left;
      }
    }
    
    class Solution {
    public:
      int minEatingSpeed(vector<int>& piles, int h) {
        int left = 1, right = 1e9;
        while (left < right) {
          int mid = (left + right) >> 1;
          int s = 0;
          for (int& x : piles) s += (x + mid - 1) / mid;
          if (s <= h)
            right = mid;
          else
            left = mid + 1;
        }
        return left;
      }
    };
    
    func minEatingSpeed(piles []int, h int) int {
      return sort.Search(1e9, func(i int) bool {
        if i == 0 {
          return false
        }
        s := 0
        for _, x := range piles {
          s += (x + i - 1) / i
        }
        return s <= h
      })
    }
    
    function minEatingSpeed(piles: number[], h: number): number {
      let left = 1;
      let right = Math.max(...piles);
      while (left < right) {
        const mid = (left + right) >> 1;
        let s = 0;
        for (const x of piles) {
          s += Math.ceil(x / mid);
        }
        if (s <= h) {
          right = mid;
        } else {
          left = mid + 1;
        }
      }
      return left;
    }
    
    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;
      }
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文