【LeetCode】875. 爱吃香蕉的珂珂

151 阅读1分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

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

二、思路分析:

我们读取本题,可以获知题目要求我们求出珂珂吃完所有香蕉的最小速度,可以明确两点信息:

  • 珂珂每小时只能吃1堆香蕉piles[i]
  • 当piles[i]小于K时,珂珂吃完不会吃别的

读完题目,我么可以明确最小速度k的最小范围为1

那我们继续来看题目中给出示例1:piles = [3,6,7,11], h = 8,手动推理一下:

珂珂吃香蕉的速度speed为5或者4时,都符合警察回来的时间,k值就取min(5,4)

image.png

根据示例的演示推理,那解答该题目,我们可以是有二分法来找最小速度,思路如下:

  • 首先根据题目要求,我们可以知道speed速度范围在[1,max(piles)]
  • 1、每小时吃的香蕉数目最多不能超过piles[i]: speed * h <= piles[i]
  • 2、当在speed下h小时吃完香蕉数,则 k<=speed,则K上线则为speed
  • 3、当在speed下h小时未吃完香蕉,则 K > speed,则k下限则为speed+1
  • 4、piles 和 speed 都是大于0的,因此times = (pile+speed−1)/speed

根据上述思路,我们可以使用Python进行求解,代码如下:

class Solution(object):
    def minEatingSpeed(self, piles, h):
        """
        :type piles: List[int]
        :type h: int
        :rtype: int
        """
        def custime(piles,speed):           
            times = 0          
            for i in range(len(piles)):
                curtime = (piles[i]+speed-1)/speed
                times += curtime     
            return times
        
        low,high = 1,max(piles)
        k = high
        while low < high:
            speed = (high-low)/2 + low
            curtime = custime(piles,speed)
            if curtime <= h:
                k = speed
                high = speed 
            else:
                low = speed+1              
        return k

三、总结:

本题主要考察二分法思想,难点在于我们要求道speed的范围且sum(piles[i]/speed)小于h,AC 代码提交如下:

image.png

  • 时间复杂度O(nlogm),其中 n 是数组piles 的长度,m 是数组piles 中的最大值。
  • 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~