一、解题思路
题目链接
其实依然是使用二分来解,只不过这次的二分并不是数组下标的二分,而是每个桶之间距离的二分。
审题后不难理解,最终答案肯定在相邻桶最短距离 ~ 两头桶之间的距离 之间。我们在这个范围进行二分即可。
最后时间复杂度应该是O(Nlog(N)),严格来说是O(arrLen * log(maxDistance))
二、代码
1、check:负责检查指定距离是否能实现,依次遍历所有桶,看最后球是否能放满即可。
func check(position []int, ballNum int, minLen int) bool {
// 起始位置肯定要放球
ballNum--
currentPos := 1
lastPos := 0
for ballNum > 0 && currentPos < len(position) {
if position[currentPos]-position[lastPos] >= minLen {
lastPos = currentPos
ballNum--
}
currentPos++
}
if 0 == ballNum {
return true
} else {
return false
}
}
2、二分遍历距离
保证for 循环能退出就行
func MaxDistance(position []int, m int) int {
sort.Ints(position)
// 开始二分搜索
retDis := 0
maxDis := (position[len(position)-1] - position[0]) / (m - 1)
minDis := math.MaxInt64
for index := 0; index < len(position)-1; index++ {
currentDis := position[index+1] - position[index]
if minDis > currentDis {
minDis = currentDis
}
}
leftDis, rightDis := minDis, maxDis
for leftDis <= rightDis {
midDis := (leftDis + rightDis) / 2
if check(position, m, midDis) {
leftDis = midDis + 1
retDis = midDis
} else {
rightDis = midDis - 1
}
}
return retDis
}
三、总结
其实二分搜索使用场景还是挺多的,不要仅仅纠结于数组下标。需要多做题多总结。