友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

1011. Capacity To Ship Packages Within D Days

A conveyor belt has packages that must be shipped from one port to another within D days.

The i-th package on the conveyor belt has a weight of weights[i]. Each day, we load the ship with packages on the conveyor belt (in the order given by weights). We may not load more weight than the maximum weight capacity of the ship.

Return the least weight capacity of the ship that will result in all the packages on the conveyor belt being shipped within D days.

Example 1:

Input: weights = [1,2,3,4,5,6,7,8,9,10], D = 5
Output: 15
Explanation:
A ship capacity of 15 is the minimum to ship all the packages in 5 days like this:
1st day: 1, 2, 3, 4, 5
2nd day: 6, 7
3rd day: 8
4th day: 9
5th day: 10

Note that the cargo must be shipped in the order given, so using a ship of capacity 14 and splitting the packages into parts like (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) is not allowed.

Example 2:

Input: weights = [3,2,2,4,1,4], D = 3
Output: 6
Explanation:
A ship capacity of 6 is the minimum to ship all the packages in 3 days like this:
1st day: 3, 2
2nd day: 2, 4
3rd day: 1, 4

Example 3:

Input: weights = [1,2,3,1,1], D = 4
Output: 3
Explanation:
1st day: 1
2nd day: 2
3rd day: 3
4th day: 1, 1

Note:

  1. 1 ⇐ D ⇐ weights.length ⇐ 50000

  2. 1 ⇐ weights[i] ⇐ 500

思路分析

二分查找,确定左边界

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * 二分查找,确定左边界
 *
 * @author D瓜哥 · https://www.diguage.com
 * @since 2024-08-15 21:25:01
 */
public int shipWithinDays(int[] weights, int days) {
  if (weights == null || weights.length == 0) {
    return 0;
  }
  int left = weights[0];
  int right = 0;
  for (int weight : weights) {
    left = Math.max(left, weight);
    right += weight;
  }
  while (left < right) {
    int mid = left + (right - left) / 2;
    int time = getTime(weights, mid);
    if (time <= days) {
      // 如果时间小于等于指定天数,那么就需要降低货运能力
      right = mid;
    } else {
      left = mid + 1;
    }
  }
  return left;
}

/**
 * 指定装载能力下,所需的天数
 */
private int getTime(int[] weights, int cap) {
  int days = 0;
  for (int i = 0; i < weights.length; ) {
    int x = cap;
    // 在承载能力允许的范围内,尽可能多装
    while (i < weights.length) {
      // 剩余空间,不够装下当前货物,则天数加 1
      if (x < weights[i]) {
        break;
      } else {
        x -= weights[i];
      }
      i++;
    }
    days++;
  }
  return days;
}