Magnetic Force Between Two Balls — BS on Minimum Distance
Advertisement
Problem 322 · Magnetic Force Between Two Balls
Difficulty: Medium · Pattern: BS on Answer (maximize minimum gap)
Place m balls in baskets to maximize the minimum magnetic force (distance) between any two.
Solutions
# Python
def maxDistance(position, m):
position.sort()
def feasible(gap):
count = 1; prev = position[0]
for p in position[1:]:
if p - prev >= gap: count += 1; prev = p
return count >= m
lo, hi = 1, (position[-1]-position[0])//(m-1)
while lo < hi:
mid = (lo+hi+1)//2 # upper mid (maximize)
if feasible(mid): lo = mid
else: hi = mid-1
return lo
// Java
public int maxDistance(int[] position, int m) {
Arrays.sort(position);
int lo=1, hi=(position[position.length-1]-position[0])/(m-1);
while (lo<hi) {
int mid=lo+(hi-lo+1)/2, cnt=1, prev=position[0];
for (int p:position) if(p-prev>=mid){cnt++;prev=p;}
if (cnt>=m) lo=mid; else hi=mid-1;
}
return lo;
}
Complexity
- Time: O(n log(max/m))
- Space: O(1)
Note
When maximizing, use upper mid (lo+hi+1)//2 and set lo=mid on success.
Advertisement