IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【二分--分堆】 -LeetCode-1011. 在 D 天内送达包裹的能力 -> 正文阅读

[数据结构与算法]【二分--分堆】 -LeetCode-1011. 在 D 天内送达包裹的能力

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
提示:

  • 1 < = d a y s < = w e i g h t s . l e n g t h < = 5 ? 1 0 4 1 <= days <= weights.length <= 5 * 10^4 1<=days<=weights.length<=5?104
  • 1 < = w e i g h t s [ i ] < = 500 1 <= weights[i] <= 500 1<=weights[i]<=500

一开始误以为是“背包问题”,后来看了 三叶姐 题解 才发现原来是 “二分”。

二分

本题和 LeetCode-2226. 每个小孩最多能分到多少糖果 有很大的相似之处。

思路 🤔

  1. 船所需的最低运载能力:为 max,即最起码能保证一次能把 w e i g h t s weights weights中最大的货物运输到另一港口;

  2. 船所需的最高运载能力:为 sum,即一次就把全部货物运输到另一港口;

  3. 开始二分

    利用“两段性”:设最终所需最小装载能力 res。若运载能力 < res 时, 则无法满足 d a y s days days 天运输完所有货物;若运载能力 >= res 时, 则可以满足 d a y s days days 天运输完所有货物

    • 当按照运载能力mid装船时,可以将所有货物都能在 d a y s days days 天内都运输完毕,则“尝试”更小的装载量是否可以满足,即 right = mid - 1
    • 否则,则说明当前 mid 运载能力不足,则需要船具有更大的运载能力,即 left = mid + 1

class Solution {
    public int shipWithinDays(int[] weights, int days) {
        int max = 0;
        int sum = 0;
        for (int weight : weights) {
            max = Math.max(max, weight);
            sum += weight;
        }
        int left = max;  // 最小运载能力
        int right = sum; // 最大运载能力
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (check(weights, mid, days)) { // 按照mid装船时,可以满足,则“尝试”更小的装载量是否可以满足,即mid - 1
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }

    // 将weight
    boolean check(int[] weights, int target, int days) {
        int cnt = 0;
        for (int i = 0; i < weights.length; ) {
            int sum = 0;
            // 找一堆连续“最接近”(但不超过)target的总和
            while (i < weights.length && sum + weights[i] <= target) {
                sum += weights[i++];
            }
            cnt++;
        }
        return cnt <= days;
    }

    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,6,7,8,9,10};
        int days = 5;
        System.out.println(new Solution().shipWithinDays(nums, days));
    }
}

在这里插入图片描述

410. 分割数组的最大值

在这里插入图片描述
在这里插入图片描述

二分

class Solution {
    public int splitArray(int[] nums, int m) {
        int n = nums.length;
        int max = 0;
        int sum = 0;
        for (int i : nums) {
            sum += i;
            max = Math.max(max, i);
        }
        int left = max;
        int right = sum;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (check(nums, mid, m)) { // 尝试更小的“分堆和”
                right = mid - 1;
            } else {    
                left = mid + 1;
            }
        }
        return left;
    }

    boolean check(int[] nums, int target, int m) {
        int cnt = 0;
        for (int i = 0; i < nums.length; ) {
            int sum = 0;
            while (i < nums.length && sum + nums[i] <= target) {
                sum += nums[i++];
            }
            cnt++; // 增加“堆数”
        }
        return cnt <= m;
    }
}

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:46:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:37:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码