1552. 两球之间的磁力
大约 3 分钟
--- 
1552. 两球之间的磁力
- 标签:数组、二分查找、排序
- 难度:中等
题目链接
题目大意
描述:给定一个数组 ,表示 个篮子的位置。有 个球需要放入篮子中,每个篮子最多放一个球。
磁力定义为任意两个球之间的最小距离。目标是通过合理安排球的位置,使得最小磁力最大。
要求:返回最大化的最小磁力。
说明:
- 。
- 。
- 。
示例:
- 示例 1:

输入:position = [1,2,3,4,7], m = 3
输出:3
解释:将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。- 示例 2:
输入:position = [5,4,3,2,1,1000000000], m = 2
输出:999999999
解释:我们使用位于 1 和 1000000000 的篮子时最小磁力最大。解题思路
思路 1:二分答案 + 贪心验证
1. 核心思想
最小距离的最大化,是典型的二分答案问题。
答案范围:最小可能距离 (两个球紧挨),最大可能距离 (两个球放两端)。
验证函数 :能否放置 个球,使得任意两球间距 。
贪心放置:对 排序后,从第一个位置开始放球,每次选距离上一次放置 的最左位置。
2. 具体步骤
第 1 步:对 排序。
第 2 步:二分左边界 ,右边界 。
第 3 步:当 时:
- 。
- 如果 为
True(可以放置),。 - 否则 。
第 4 步:返回 。
3. check 函数的贪心证明
排序后,从第一个篮子放第一个球,然后尽量选择离上一个球最远但至少 的位置。这种贪心策略能最大化剩余空间,因此如果这种策略放不下 个球,其他策略也放不下。
4. 举例说明
以 为例:
排序后 。
二分过程:
- ,。
- :位置 放第 个球,下一位置 选 放第 个球,下一位置 选 放第 个球。,。
- ,。
- :( 到 距离 ),但只能放 个球。,。
- ,。
- :,只能放 个球。,。
- 返回 。
最大最小磁力为 。
思路 1:代码
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
position.sort()
n = len(position)
def check(dist):
count = 1
last = position[0]
for i in range(1, n):
if position[i] - last >= dist:
count += 1
last = position[i]
if count >= m:
return True
return False
l, r = 1, position[-1] - position[0]
while l < r:
mid = (l + r + 1) // 2
if check(mid):
l = mid
else:
r = mid - 1
return l思路 1:复杂度分析
- 时间复杂度:,排序 ,二分 次( 为最大值与最小值之差),每次验证 。
- 空间复杂度:。