• 【LeetCode75】第五十六题 爱吃香蕉的珂珂


    目录

    题目:

    示例:

    分析:

    代码:


    题目:

    示例:

    分析:

    这道题挺炸裂的,题目给我们一个数组,数组里的每个元素表示每个仓库里的香蕉数量。

    珂珂可以自己控制自己吃香蕉的速度,也就是每小时可以吃几根香蕉,不过同一个小时只会待在同一个仓库里,也就是所就算吃完了一个仓库的香蕉,并且一小时里还有剩余时间,它也不会跑去其他仓库吃。

    问我们在h小时内吃完所有仓库的所需最小的速度是多少,因为珂珂这个b想要慢慢地偷吃。

    首先题目给出条件:

     h是大于仓库数量的,所以我们是一定的得出答案的。

    如果把速度定成所有仓库里最多的香蕉数,那么吃完吃需要仓库数量的时间,也是至少要花的时间,因为你速度再提高也不会减少花费的时间。

    而速度最低定成1,那么吃完仓库数量的时间就是所有仓库里香蕉的数量总和。

    我们就把速度的范围定下来了,就是 [ 1 , 仓库里最多的香蕉数 ] ,确定范围之后,我们可以使用二分查找法来进一步缩小范围,最终确定答案。

    我们每次取范围的中间数当作速度,看看按照这个速度吃完的时间有没有超过h,如果没有超过,那么就说明我们还有可能可以再慢一些,那么我们收缩右范围来使得范围的中位数变小。如果超过了h,那就说明我们的速度偏慢了,得提高速度,那么就要收缩左范围来使得范围的中位数变大。

    最终我们就可以把范围缩小到答案。

    代码:

    1. class Solution {
    2. public:
    3. int eat(const vector<int>& piles,int time){ //如果以time的速度吃,需要多久
    4. int ans=0;
    5. for(int p:piles){
    6. //如果剩余数量不是time的整数倍,那么需要额外+1
    7. if(p%time!=0) ans++;
    8. ans+=p/time;
    9. }
    10. return ans;
    11. }
    12. int minEatingSpeed(vector<int>& piles, int h) {
    13. int l=1;int r=piles[0]; //左闭右闭
    14. for(int p:piles) r=max(r,p);
    15. int time;
    16. int res=r;
    17. while(l
    18. int temp=l+(r-l)/2;
    19. time=eat(piles,temp);
    20. if(time<=h){ //如果当前速度满足条件,那么缩小右边界看看能不能用更小的速度.
    21. res=temp;
    22. r=temp;
    23. }else{ //如果不满足条件,那么缩小左边界,提升速度.
    24. l=temp+1;
    25. }
    26. }
    27. return res;
    28. }
    29. };

  • 相关阅读:
    颜色分类(中等)
    数据结构七:七大排序(插入排序,希尔排序,选择排序,堆排序冒泡排序,快速排序,归并排序)
    登录认证,登录校验
    多线程知识点整理
    windows使用mysqldump
    JavaWeb篇_08——Servlet技术以及第一个Servlet案例
    SCSS目录结构
    基于PHP+MySQL珠宝销售网站的设计与开发
    wordpress后台不能登录(多次重定向),前台样式里面https加载不上该怎么办呢?
    性能测试操作流程
  • 原文地址:https://blog.csdn.net/m0_63235356/article/details/132206091