二分法,2球之间的最大磁力;即最大最小值问题

求最小磁力的最大值能是多大
1

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),只维护了几个变量

这种二分方法调函数的也需要学习一下;最大最小值问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值