发布于 

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

题目: 在 D 天内送达包裹的能力

难度:Middle

知识点:双指针、二分法

咋说呢,这种有范围可以逆向考虑的题目还是得用二分法逐一验证啊!多说无益,全是套路,记住这种出现范围和可验证的条件吧!

解法

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
//执行耗时:9 ms,击败了97.62% 的Java用户
//内存消耗:45.3 MB,击败了12.84% 的Java用户
class Solution {
public int shipWithinDays(int[] weights, int days) {
// 确定二分查找左右边界
int left = Integer.MIN_VALUE;
int right = 0;
for (int weight : weights) {
left = Math.max(weight, left);
right += weight;
}
while (left < right) {
int mid = (left + right) / 2;
// need 为需要运送的天数
// cur 为当前这一天已经运送的包裹重量之和
int need = 1, cur = 0;
for (int weight : weights) {
//这个地方注意判断条件
if (cur + weight > mid) {
++need;
cur = 0;
}
cur += weight;
}
if (need <= days) {
right = mid;
} else {
//mid不应该被包含进来
left = mid + 1;
}
}
return left;
}
}

类似题目

LC875 LC1231