题目描述
解法
自己没想出来,参考了大佬的思路解法,下面试着用自己的话讲一遍。这道题是属于求“最大最小”
的题型,一般使用二分法
,在本题中要求“最大的最小磁力”,我们先考虑最小磁力,最小磁力肯定出现在相邻两个数之间,比如数组:
[1,2,3,4,6]
的最小磁力就是1,要求取最小磁力,只需要遍历一遍即可。
接下来我们来考虑最大磁力,在有序数组中要放置m
个小球,也就是会产生m-1
个距离,最大值为max
,最小值为min
,如果数组是连续
的(在题意中就是假设所有位置都有篮子,但实际上可能不满足),那么小球均匀摆布的情况下能取到最大磁力:
( m a x − m i n ) / ( m − 1 ) (max - min)/(m-1) (max−min)/(m−1)
上面所求的最小磁力就是左边界
,最大磁力就是右边界
。题目中所要求的两球之间最大的最小磁力
就落在左右边界之间。对此,我们可以用二分法的思想,先取左右边界的中点mid
,再判断当前数组是否能满足当前mid
值(也就是能否放置所有小球,满足两球之间最大的最小磁力
值为mid
),对于判断结果,有两种情况:
- 可以满足。说明我们一开始估计的左边界过小,所以更新
左边界=mid+1
- 不满足。说明有边界过大,所以更新
右边界=mid-1
最后的问题就是如何判断当前数组能否放下满足当前mid
值呢?
我们需要编写一个check函数,然后从数组头部开始向后遍历。思路是:有序数组的第一个位置肯定是要放置小球,因为要满足最大最小磁力值≥mid
,所以摆放小球的第二个小球与第一个小球的距离 d 1 d_1