解题思路
这个题最难的点在于,怎么知道在给定的磁力值下,可以放置多少个球。其实就是在排序之后,从第一个开始往后找相邻的两个来比较绝对值大小,如果得出来的磁力值等于给定的磁力值,说明最起码的磁力值要求已经满足,容易忽略的是大于给定的磁力值情况,大于给定的磁力值即说明磁力值仍可以加大一些,它仍是合法的。
同理比较在给定磁力值的情况下算出来的球数和限定的球数比较,如果大于或者等于限定的球数,说明在这个磁力下仍可以放置m个球,不是最小磁力里最大的。
代码
/**
* @param {number[]} position
* @param {number} m
* @return {number}
*/
var maxDistance = function(position, m) {
position.sort((a, b) => a - b)
let low = 1
let high = position[position.length - 1] - low
// 计算在计算出来的磁力值的情况下,可以放置多少个球
let countM = function (buckets, forceValue) {
let first = buckets[0]
// first 放了一个
let count = 1
for (let i = 1; i < buckets.length; i++) {
// 相邻两个的值有大于的或者等于的是符合要求的,算相邻两个球符合给定磁力值的个数
if (Math.abs(first - buckets[i]) >= forceValue) {
first = buckets[i]
count++
}
}
return count
}
let maxMinForceValue = high
while (low <= high) {
let mid = (low + high) >>> 1
const mNumber = countM(position, mid)
// 球的个数比给定的球个数相等或大于,则表示在这个磁力下,一定可以放置m个小球
if (mNumber >= m) {
maxMinForceValue = mid
low = mid + 1
} else {
high = mid - 1
}
}
return maxMinForceValue
};