【Leetcode】1552. 两球之间的磁力——1920
题目
在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有
n
个空的篮子,第 i 个篮子的位置在position[i]
,Morty 想把m
个球放到这些篮子里,使得任意两球间 最小磁力 最大。已知两个球如果分别位于
x
和y
,那么它们之间的磁力为|x - y|
。给你一个整数数组
position
和一个整数m
,请你返回最大化的最小磁力。
- \(n==position.length\)
- \(2\leq n\leq 10^5\)
- \(1\leq position[i] \leq 10^9\)
- 所有\(position\)中的整数互不相同
- \(2\leq m\leq position.length\)
思路
也算是一个比较典型的二分法了,最小值的最大化
当给定磁力较小的时候,往往可以放入多于m
个小球。随着给定磁力越来越大,此时可以放入的小球的个数就会越来越少。即磁力于可放入小球的关系为负相关。
如果给定目前限制球之前的磁力,那么此时能够放入的小球的个数就是按照贪心的思路,尽可能多的放入小球。
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
position.sort()
def check(v):
cnt = 1
pre = position[0]
for x in position:
if x-pre>=v:
cnt+=1
pre = x
return cnt<m
return bisect_left(range(1,position[-1]),True,key=check)
上述代码需要注意的是,为什么在check函数中,当前限定磁力之后能够放入小球的个数小于需要放入的小球的个数的时候返回True
,
bisect_left 函数默认情况下是针对于递增函数的二分法计算,因此此时返回是否小于需要放入的个数,保证函数变为递增。