Leetcode1011. 在D天内送达包裹的能力
1. 问题描述
2. 思路
二分查找
3. 代码
func shipWithinDays(weights []int, days int) int {
sum := 0
for i := 0; i < len(weights); i++ {
sum += weights[i]
}
max := getMax(weights)
left, right := max, sum
for left <= right {
mid := left + (right - left) / 2
midDays := countDays(weights, mid)
if midDays == days { // 天数相等,尝试下使用更小的船
right = mid - 1
} else if midDays < days { // 很少的天数就能完成,船太大了,浪费
right = mid - 1
} else { // 很多天才能完成,船太小
left = mid + 1
}
}
return left
}
func getMax(nums []int) int {
max := nums[0]
for i := 0; i < len(nums); i++ {
if nums[i] > max {
max = nums[i]
}
}
return max
}
func countDays(weights []int, k int) int {
var count int
i, sum := 0, 0
for i < len(weights) {
sum += weights[i]
if sum < k && i == len(weights) - 1 {
count++
}
if sum == k {
sum = 0
count++
}
if sum > k {
sum = 0
i--
count++
}
i++
}
return count
}