求最小磁力的最大值能是多大
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
position.sort()#需要先排序,才能求最大边界值
left = min((position[i+1] - position[i]) for i in range(len(position) - 1))#最小边界值
right = position[-1]-position[0]#最大边界值
def check(diff):#该函数的作用是判断当前磁力是否合适,通过该磁力下篮子的个数判断
cnt = 0#篮子的个数
i,j = 0,0
while j < len(position):
while j<len(position) and position[j]-position[i]<diff:#磁力低于当前磁力,则继续向右
j +=1
if j < len(position):#判断上个while跳出是因为找到了>当前磁力的吗,如果是,记录该篮子
cnt +=1
# i = j#i不是表示循环的开始,而是表示上述确定了1一个篮子后,剩下的是否能继续找篮子,所以剩下的要从j之后开始
i=j
return cnt >=m-1 #定义的判断条件就是该磁力下的篮子数cnt,是否>=m-1个间隔数
while left<=right: #普通的二分方法
mid =(left+right)//2
if check(mid):
left =mid+1 #注意,有的二分方法的缩小边界的方法是left =left+1,right=right-1;有的是基于
#left = mid+1,right=mid-1
else:
right =mid-1
return left-1
时间复杂度,二分法O(logn),二分每次调用的check方法,是O(n),所以二分法整体时间复杂度O(nlogn),数组排序时间复杂度O(nlogn),所以总的时间复杂度O(nlogn)
空间复杂度O(1),只维护了几个变量
这种二分方法调函数的也需要学习一下;最大最小值问题