当前位置: 首页 > article >正文

力扣labuladong一刷day24天

力扣labuladong一刷day24天

文章目录

      • 力扣labuladong一刷day24天
      • 一、875. 爱吃香蕉的珂珂
      • 二、1011. 在 D 天内送达包裹的能力
      • 三、410. 分割数组的最大值

一、875. 爱吃香蕉的珂珂

题目链接:https://leetcode.cn/problems/koko-eating-bananas/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:本质上是一个二分搜索左边界的问题,每个小时吃多少都可以,要找的是每小时吃k个,h个小时正好吃完,抽取出来计算用多少小时吃完的函数,小时数超了应该扩大k,小时数少了应该缩小k。

class Solution {
   public int minEatingSpeed(int[] piles, int h) {
        int left = 1, right = 1000000000;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (f(mid, piles) <= h) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return left;
    }

    long f(int k, int[] piles) {
        long h = 0;
        for (int i = 0; i < piles.length; i++) {
            h += piles[i] / k;
            if (piles[i] % k > 0) {
                h++;
            }
        }
        return h;
    }
}

二、1011. 在 D 天内送达包裹的能力

题目链接:https://leetcode.cn/problems/capacity-to-ship-packages-within-d-days/
思路:这题类似上一题,有 一个容量K,要求在day天运送完成所使用的最小k。在left和right的选取上要先设置好范围,最小就是最小的包裹,最大就是全体都能放下。计算天数时注意结尾的处理,最后没装满或者装多了只要不是正好是0都要多加1天。

class Solution {
      public int shipWithinDays(int[] weights, int days) {
        int left = 0;
        int right = 1;
        for (int w : weights) {
            left = Math.max(left, w);
            right += w;
        }
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (f(weights, mid) <= days) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return left;
    }

    int f(int[] weights, int x) {
        int day = 0, sum = 0;
        for (int i = 0; i < weights.length; i++) {
            if (sum+weights[i] == x) {
                day++;
                sum = 0;
            }else if (sum + weights[i] < x) {
                sum += weights[i];
            }else {
                day++;
                sum = weights[i];
            }
        }
        return sum == 0 ? day : day+1;
    }
}

三、410. 分割数组的最大值

题目链接:https://leetcode.cn/problems/split-array-largest-sum/
思路:把数组顺序分成k个区间,要求所有的分法当中各个和最大区间的 最小值。其实也就是有很多货物,让k天运完,求船的最小容量,
一样是先确定left和right的边界,边界里的数是船的容量,不可能说船的容量装不下某一个货物,故left应该是所有货物中的最大值。right的话看天数要求,天数最少1天,right最大为货物总和。
f(mid) 与 k如何调节,其实直接分析就行,怎么写都可以,加入写成f(mid) <= k 那么说明船容量太大,导致天数少了,所以缩小容量天数就大了,即right = mid -1;
else就是 f(mid) > k 那么就是船的容量太小,导致天数多了,故扩大容量让天数变下,left = mid + 1;

class Solution {
    public int splitArray(int[] nums, int k) {
        int left = 0, right = 0;
        for (int i : nums) {
            left = Math.max(left, i);
            right += i;
        }
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (f(nums, mid) <= k) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return left;
    }

    int f(int[] nums, int c) {
        int m = 0, sum = 0;
        for (int i = 0; i < nums.length; i++) {
            if (sum + nums[i] == c) {
                m++;
                sum = 0;
            } else if (sum + nums[i] < c) {
                sum += nums[i];
            }else {
                m++;
                sum = nums[i];
            }
        }
        return sum == 0 ? m : m + 1;
    }
}

http://www.kler.cn/a/154922.html

相关文章:

  • 【Linux网络编程】简单的UDP网络程序
  • CSS 响应式设计之媒体查询技术
  • vue3: ref, reactive, readonly, shallowReactive
  • 如何在Mac上切换到JDK 17开发环境
  • 【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)
  • 算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)
  • MySQL 教程 1.5
  • 同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试
  • 工业机器视觉megauging(向光有光)使用说明书(一,轻量级的visionpro)
  • java中@Async注解在CompletableFuture.runAsync里面使用没有生效的原因?
  • Java项目调用C/C++ SDK的方案汇总
  • 力扣题:字符串的反转-11.23
  • 盘点25个Html游戏Game源码网页爱好者不容错过
  • 前端面试JS— JS数据类型及相关内容
  • Linux 基础认识
  • 【每日一题】拼车+【差分数组】
  • DQN原理及PyTorch实现【强化学习】
  • java使用poi读写excel(处理上下标和科学计数法)
  • PriorityQueue类
  • 大数据基础设施搭建 - 业务数据同步策略
  • Linux shell中的函数定义、传参和调用
  • c++的函数对象和适配器
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】单目视觉估计
  • 富文本编辑器(wangEditor 5)
  • Chat-GPT原理
  • 93基于matlab的萤火虫算法优化支持向量机(GSA-SVM)分类模型