欢迎光临
我们一直在努力

D.二分查找-二分答案-求最小——875. 爱吃香蕉的珂珂

题目链接:875. 爱吃香蕉的珂珂(中等)

算法原理:

解法:二分查找

12ms击败43.55%

时间复杂度O(n log max_p)(n为数组长度,max_p为数组最大值)

整体思路与上一题非常相似👇

D.二分查找-二分答案-求最小——1011. 在 D 天内送达包裹的能力

相似之处👇

①吃香蕉速度≈运载能力

②警卫h小时后回来≈在days天内完成运输

③你每根香蕉≈每单位重量

④都可以看成按顺序运载、吃香蕉

⑤每小时只能吃一堆的香蕉≈每天只能运一次

不同之处👇

①每根香蕉≈每单位重量,上题的weights数组中的数不可再分,而此题的同一堆香蕉可以分两小时吃完

②上题的第一天剩下的包裹可以第二天接着运,而此题第一堆剩下的香蕉不可与第二堆的香蕉一起吃,必须单独各拎出一小时来吃各堆剩下的香蕉,所以检查方法check需要有些改动

③初始化有所改动:

left要初始化为1,而不是0,因为速度为0时永远吃不完

right要初始化为数组中的最大值,而不是所有香蕉的总和,因为最快速度就是每堆一小时吃完

其余的与上题基本相同

吃香蕉速度↑ 需要时间↓

①初始化:

right初始化:数组中的最大值

left初始化:1

②分析要找的目标值,来分析left和right最终的位置,写出判断方法check,判断当前吃香蕉速度为mid时需要的小时数是否恰好小于等于警卫回来的h小时

③在时间逐渐变小到恰好小于等于警卫回来的h小时的过程中,需要mid不断右移,对应着区间中最左端点的左边,此时还是未符合题意的mid,需要check返回true来实现mid不断右移

④当时间逐渐减小到恰好小于等于警卫回来的h小时的mid,也就是区间中最左端点的左边,即我们要的最慢吃香蕉速度

Java代码:

class Solution {
public int minEatingSpeed(int[] piles, int h) {
int left=1,right=0;
for(int x:piles)
right=Math.max(right,x);
while(left<right){
int mid=left+(right-left)/2;
if(check(piles,mid,h)) left=mid+1;
else right=mid;
}
return left;
}
private boolean check(int[] piles,int mid,int t){
int h=0;
for(int x:piles){
//mid的速度吃若干次能恰好吃完当前堆的香蕉
if(x%mid==0) h+=(int)(x/mid);
//mid的速度吃若干次当前堆香蕉后仍有剩余,需要再来一小时吃剩下的
else h+=(int)(x/mid)+1;
}
return h>t;
}
}

赞(0)
未经允许不得转载:171主机测评 » D.二分查找-二分答案-求最小——875. 爱吃香蕉的珂珂
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址