持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 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)
根据示例的演示推理,那解答该题目,我们可以是有二分法来找最小速度,思路如下:
- 首先根据题目要求,我们可以知道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 代码提交如下:
- 时间复杂度O(nlogm),其中 n 是数组piles 的长度,m 是数组piles 中的最大值。
- 空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~