当前位置:首页 > 力扣 > 力扣1011题详解:船只装载问题的二分查找优化解法(C++代码实现)

力扣1011题详解:船只装载问题的二分查找优化解法(C++代码实现)

5小时前

力扣1011题详解:船只装载问题的二分查找优化解法(C++代码实现) 力扣题解 二分查找 C++代码 第1张

一、题目解读

力扣1011题要求在给定的货物重量数组中,计算船只每天最多装载一定重量时,最少需要多少天完成运输。题目关键在于找到满足天数限制的最小最大载重量,属于典型的查找最值问题。

二、解题思路

采用二分查找算法。核心思想是将问题转化为:是否存在一个载重量阈值,使得按该阈值分配货物时,所需天数不超过给定天数。通过二分查找该阈值,降低时间复杂度。

三、解题步骤

1. 确定二分边界:左边界为最大货物重量(单日至少载1件),右边界为总重量(单日载完);

2. 二分查找:每次计算中间值mid对应的所需天数;

3. 模拟装载:遍历货物,若当前累计重量超mid,天数递增并重置累计;

4. 调整边界:若天数≤给定天数,说明阈值可能更小(右移),否则需更大(左移);

5. 返回最终左边界(因循环结束时left=right)。

四、代码与注释

class Solution {
public:
    int shipWithinDays(vector<int>& weights, int days) {
        // 确定二分查找的左右边界
        int left = *max_element(weights.begin(), weights.end());
        int right = accumulate(weights.begin(), weights.end(), 0);
        
        while (left < right) {
            int mid = left + (right - left) / 2;
            int current = 0; // 当前运载量
            int need = 1;    // 需要的天数
            
            // 计算当前运载能力下需要的天数
            for (int w : weights) {
                if (current + w > mid) {
                    need++;
                    current = 0;
                }
                current += w;
            }
            
            // 调整二分查找边界
            if (need <= days) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        
        return left;
    }
};

注释解析:

● left/right初始化为合理边界,避免无效查找;

● 内部循环通过模拟装载判断mid可行性;

● 时间复杂度O(nlogsum),n为货物数,sum为总重量。

五、总结

本题通过将“求最小满足条件值”转化为二分查找,巧妙利用单调性优化。关键在于设计合理的二分判定条件(模拟装载过程),以及边界值的正确初始化。掌握此类转换思路可高效解决类似最值查找问题。



原创内容 转载请注明出处

分享给朋友:

相关文章

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

一、题目解读汉诺塔问题是一个经典的递归算法题目:有n个大小不同的圆盘按从大到小顺序放在柱A上,需借助柱B,将圆盘移至柱C,每次只能移动一个圆盘,且大圆盘不能置于小圆盘之上。牛客4414题要求编写函数输...

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

一、题目解读牛客3750题要求在一个给定的整数数组中,计算指定窗口大小下的滑动窗口最大值。例如,输入数组num=[1,3,-1,-3,5,3,6,7],窗口大小为size=3时,需输出每个窗口内的最大...

手搓二叉搜索树代码详解:从入门到实现(附完整注释)

一、简介和应用二叉搜索树(Binary Search Tree,BST)是一种经典的数据结构,其特点在于每个节点的左子树所有节点值均小于该节点,右子树所有节点值均大于该节点。这种特性使得它在查找、插入...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

一、题目解读题目要求解决旅行家从起点到终点(D1公里)的预算问题,需在沿途N个加油站中规划加油策略,使总费用最小化。每个加油站有不同油价和距离,汽车每升油可行驶D2公里,初始油量为C升,终点无加油站。...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。