首页 > 其他分享 >Leetcode 875. 爱吃香蕉的珂珂

Leetcode 875. 爱吃香蕉的珂珂

时间:2024-09-30 20:23:34浏览次数:11  
标签:香蕉 二分 piles int 875 Leetcode check left

1.题目基本信息

1.1.题目描述

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

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

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

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

1.2.题目地址

https://leetcode.cn/problems/koko-eating-bananas/description/

2.解题方法

2.1.解题思路

二分查找

2.2.解题步骤

第一步,判断是否可以用二分查找。因为吃的速度在1到max(piles)之间,且可以判断某个速度下是否能吃完,所以可以使用二分法。

第二步,理解红蓝染色法在该二分过程中的不变特征。红:check不能吃完,蓝:check能吃完;左闭右闭区间:left-1:始终指向红色,right+1始终指向蓝色;最终的left即为最小的能吃完的速度。

第三步,定义check的判断函数,如果速度是speed,那么吃完所有的香蕉需要的总时间即为每堆香蕉数除以速度并上取整的和,如果总时间小于等于h,则可以吃完,反之,吃不完。

第四步,根据check函数和左闭右闭的红蓝染色法二分模板进行编码获得最终的left,最终的left即为题解。

3.解题代码

Python代码

import math

# 二分查找
# 第一步,判断是否可以用二分查找。因为吃的速度在1到max(piles)之间,且可以判断某个速度下是否能吃完,所以可以使用二分法。
# 第二步,理解红蓝染色法在该二分过程中的不变特征。红:check不能吃完,蓝:check能吃完;左闭右闭区间:left-1:始终指向红色,right+1始终指向蓝色;最终的left即为最小的能吃完的速度。
# 第三步,定义check的判断函数,如果速度是speed,那么吃完所有的香蕉需要的总时间即为每堆香蕉数除以速度并上取整的和,如果总时间小于等于h,则可以吃完,反之,吃不完。
# 第四步,根据check函数和左闭右闭的红蓝染色法二分模板进行编码获得最终的left,最终的left即为题解。
class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        # 红:check不能吃完,蓝:check能吃完;左闭右闭:left-1:始终指向红色,right+1始终指向蓝色;最终的left即为最小的能吃完的速度
        def check(speed):   # 返回是否能吃完
            sumHours=0
            for pile in piles:
                sumHours+=math.ceil(pile/speed)
            return sumHours<=h
        left,right=1,max(piles)
        while left<=right:
            mid=(right-left)//2+left
            if not check(mid):
                left=mid+1
            else:
                right=mid-1
        return left

C++代码

class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        int left=1;
        int right=*max_element(piles.begin(),piles.begin()+piles.size());
        while(left<=right){
            int mid=(right-left)/2+left;
            long long sumHours=0;
            for(int pile:piles){
                sumHours+=ceil(pile/double(mid));
            }
            if(sumHours>h){
                left=mid+1;
            }else{
                right=mid-1;
            }
        }
        return left;
    }
};

4.执行结果

在这里插入图片描述

标签:香蕉,二分,piles,int,875,Leetcode,check,left
From: https://blog.csdn.net/m0_51437455/article/details/142651071

相关文章

  • Leetcode:栈和队列的互相实现
    目录一、用两个队列实现栈题目:分析:代码实现: 二、用两个栈实现队列题目: 分析:代码:总结:核心就在于先进先出和后进先出之间的一个灵活变换,两个栈能够先进先出,而两个队列能够后进先出 一、用两个队列实现栈题目:.-力扣(LeetCode).-备战技术面试?力扣提供海量技术......
  • leetcode1353. 最多可以参加的会议数目
    给你一个数组 events,其中 events[i]=[startDayi,endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <=d<=endDayi 中的任意一天 d 参加会议 i 。在任意一天 d 中只能参加一场会议。请你返回你可以参加的 最大 会议......
  • leetcode133. 克隆图
    给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int)和其邻居的列表(list[Node])。classNode{publicintval;publicList<Node>neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个......
  • Leetcode 981. 基于时间的键值存储
    1.题目基本信息1.1.题目描述设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。实现TimeMap类:TimeMap()初始化数据结构对象voidset(Stringkey,Stringvalue,inttimestamp)存储给定时间戳timestamp......
  • Leetcode 875. 爱吃香蕉的珂珂
    1.题目基本信息1.1.题目描述珂珂喜欢吃香蕉。这里有n堆香蕉,第i堆中有piles[i]根香蕉。警卫已经离开了,将在h小时后回来。珂珂可以决定她吃香蕉的速度k(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k根。如果这堆香蕉少于k根,她将吃掉这堆的所有香蕉,然后这一小......
  • 【leetcode】169.多数元素
    boyer-moore算法最简单理解方法:假设你在投票选人如果你和候选人(利益)相同,你就会给他投一票(count+1),如果不同,你就会踩他一下(count-1)当候选人票数为0(count=0)时,就换一个候选人,但因为和你利益一样的人占比超过了一半不论换多少次,最后留下来的都一定是个和你(利益)相同的人。代码:......
  • C语言 | Leetcode C语言题解之第445题两数相加II
    题目:题解:structListNode*addTwoNumbers(structListNode*l1,structListNode*l2){intstack1[100];intstack2[100];inttop1=0;inttop2=0;intcarry=0;intsum=0;structListNode*temp=NULL;structListNode*he......
  • C语言 | Leetcode C语言题解之第443题压缩字符串
    题目:题解:voidswap(char*a,char*b){chart=*a;*a=*b,*b=t;}voidreverse(char*a,char*b){while(a<b){swap(a++,--b);}}intcompress(char*chars,intcharsSize){intwrite=0,left=0;for(intr......
  • C++ | Leetcode C++题解之第445题两数相加II
    题目:题解:classSolution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){stack<int>s1,s2;while(l1){s1.push(l1->val);l1=l1->next;}while(l2){......
  • C++ | Leetcode C++题解之第443题压缩字符串
    题目:题解:classSolution{public:intcompress(vector<char>&chars){intn=chars.size();intwrite=0,left=0;for(intread=0;read<n;read++){if(read==n-1||chars[read]!=chars[read......