题目:
传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。
算法:
方法一:二分查找
具备二段性,直接二分查找。
粗略确定right的最大取值,max(weights.length)(包裹数) * max(weights[i]) (每个包裹最大重量)= 25000000( 一天运完需要的船的运力)
func shipWithinDays(weights []int, days int) int {
left, right := 1, 25000000
for left < right {
mid := (left + right) / 2
if check(weights, mid, days) {
right = mid
} else {
left = mid + 1
}
}
return right
}
func check(weights []int, capacity, days int) bool {
totalWeight := 0
for i := range weights {
// 直接超载
if weights[i] > capacity {
return false
}
totalWeight = totalWeight + weights[i]
if totalWeight > capacity {
days --
totalWeight = weights[i]
} else if totalWeight == capacity {
days --
totalWeight = 0
}
if days < 0 {
return false
}
}
// 船上还有东西需要运送,再减一天
if totalWeight > 0 {
days --
}
return days >= 0
}