1552_Magnetic force between two balls_Binary_Search

Article Directory

Title description

Insert picture description here
Insert picture description here

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

Guess you like

Origin blog.csdn.net/m0_38024592/article/details/108250964