解题思路:
为了找到最少的承载量,那么就在最多容忍天数的界限下找到最少的承载量(这也是为什么返回left的原因),不断使用二分法找中间承载量,left是不考虑天数最少承载量(即至少承载最重物体),right是一天都运完。注释已经很详尽了,代码如下:
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
// 计算最少承重左右边界
int left = *max_element(weights.begin(), weights.end()), right = accumulate(weights.begin(), weights.end(), 0);
// 如果左右边界不重合
while(left < right) {
int mid = (left + right) / 2;
// need是需要的天数,cur是当日的重量
int need = 1, cur = 0;
for(int i = 0; i < weights.size(); i ++) {
// 如果超出当日最多重量就第二天接着弄
if(cur + weights[i] > mid) {
need ++;
cur = 0;
}
cur += weights[i];
}
// 如果天数不够,说明运多了
if(need <= D) {
right = mid;
} else {// 运少了
left = mid + 1;
}
}
return left;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/solution/cer-fen-fa-xiang-jie-by-heroding-s05f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/