任意两球之间的距离最大
给定m数量个球 放在n个篮子里position[n]
两球之间的距离表示为abs(position[i] - position[j])
求任意两球之间距离的最大值
找到单调性用二分法
如果任意两个球之间的距离越大,那么则能放的球越少。
给定一个答案guess_distance,当能放入球的数量大于等于的时候,
那么真实答案true_distance>=guess_distance,
否则true_distance<guess_distance
使用二分查找两个球之间的距离,可以找出放入m个球的最小距离
当满足放入球的数量大于等于的时候 所求在右半边,mid也可能是答案 ,l = mid
否则在左半区间不包括端点mid,r = mid -1
实现给定距离distance 判断能放入球的数量是否大于m
第一个球用pre记录,放在第一个篮子里,此时计数器cnt=1
遍历篮子,判断第i个篮子和第一个球之间的距离是否≥给定距离distance
是:计数器cnt++ ,pre更新成当前篮子的位置
否:继续遍历
返回:计数器cnt是否大于m
bool place(vector<int> position,int m,int dis) {
int cnt = 1;
int pre = position[0];
for(int i = 1;i < position.size();i++)
{
if(position[i] - pre >= dis)
{
pre = position[i];
cnt++;
}
}
return cnt >= m;
}
二分法实现
int maxDistance(vector<int>& position, int m) {
sort(position.begin(),position.end());
int n = position.size();
int l = 0;
int r = position[n-1];
while(l<r)
{
int mid = l + r + 1 >> 1;
if(place(position,m,mid) == true)
l = mid;
else
r = mid - 1;
}
return l;
}