Article Directory
Title description
Ideas
The question intends to maximize the minimum, similar to this, maximize the minimum, minimize the maximum, etc. can be solved by binary search.
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
"""
二分
"""
if m==2: return max(position) - min(position) # 特判
def check(mid: int) -> bool:
cnt = 1
pre = arr[0]
for i in range(1, len(arr)):
if arr[i] - pre >= mid:
cnt += 1
pre = arr[i]
return cnt >= m # cnt太多 可以试着增大mid的值
arr = list(sorted(position))
left = min([abs(arr[i]-arr[i-1]) for i in range(1, len(arr))])
right= arr[-1] - arr[0]
while left < right:
print(left, right)
mid = left + (right - left) // 2
if check(mid):
left = mid + 1
else:
right = mid
# 由于每次满足条件后左边界右移,所以左边界的左边一个数值是一定满足条件的
# 但是 最后一次的left = mid+1 不会满足条件,证明如下:
# 反证法:若left = mid+1也满足条件,即选择left为最大化的最小磁力,则下次二分时,
# 还是会执行 left = mid+1,与最后一次矛盾。
# 并且 一定会执行一次 left = mid + 1 操作
# 因为存在解,left为最小值时一定满足check要求
# 所以最后返回值为 l - 1
return left-1