lc1011-在D天内送达包裹的能力

题目描述

  • 给定一个数组和一个数字 n,把数组按顺序分成 n 份,求单份上限的最小值

示例

输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5
输出:15
解释:(1 2 3 4 5), (6 7), (8), (9), (10)
输入:weights = [3,2,2,4,1,4], days = 3
输出:6
输入:weights = [1,2,3,1,1], days = 4
输出:3

题解

  • 思路
    • 反过来想,用“二分”的方式枚举答案,验证
func shipWithinDays(weights []int, days int) int {
    l, r := 0, 50000 * 500 // len(weights): [1, 5w], weights[i]: [1, 500]
    for l < r {
        mid := (l + r) / 2
        if check(weights, mid, days) { r = mid
        } else { l = mid + 1 }
    }
    return r
}

func check(weights []int, mid, days int) bool {
    cnt, s := 1, 0
    for _, w := range weights {
        if mid < w { return false }
        if mid < s + w {
            cnt ++
            s = 0
        }
        s += w
    }
    return cnt <= days
}
posted @ 2025-08-29 20:46  余越  阅读(15)  评论(0)    收藏  举报