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

47 阅读1分钟

题目:
传送带上的包裹必须在 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
}