两球之间的磁力 力扣1552

76 阅读1分钟

任意两球之间的距离最大

给定m数量个球 放在n个篮子里position[n]
两球之间的距离表示为abs(position[i] - position[j])
求任意两球之间距离的最大值

image.png

找到单调性用二分法

如果任意两个球之间的距离越大,那么则能放的球越少。
给定一个答案guess_distance,当能放入球的数量大于等于mm的时候,
那么真实答案true_distance>=guess_distance,
否则true_distance<guess_distance
使用二分查找两个球之间的距离,可以找出放入m个球的最小距离
当满足放入球的数量大于等于mm的时候 所求在右半边,mid也可能是答案 ,l = mid
否则在左半区间不包括端点midr = 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;
    }