LeetCode第2616题-最小化数对的最大差值-python实现-图解思路与手撕代码

LeetCode第2616题-最小化数对的最大差值-python实现-图解思路与手撕代码


一、题目描述

在这里插入图片描述

二、解题思路与代码实现

1.解题思路

这道题,看见最小化最大值,那么可以用二分的思路解题。

二分的过程中需要对中间值进行判断,这个判断思路如下:

如果能找到至少p对下标值之差小于mid,那么这个中间值就可以满足题目要求,可以当做一个最大值,那么【mid,right】都可以当做最大值,题目要求的是最小化,那就需要在【left,mid】中继续二分,知道找到最小的满足条件的mid。

2.代码实现

代码如下(示例):

class Solution:
    def minimizeMax(self, nums: List[int], p: int) -> int:
        nums.sort()
        def check(mx:int):
            n=len(nums)
            pair=i=0
            while i<n-1:
                if nums[i+1]-nums[i]>mx:
                    i+=1
                else:
                    i+=2
                    pair+=1
            return pair>=p
        left,right=-1,nums[-1]-nums[0]
        while left+1<right:
            mid=(right+left)//2
            if check(mid):
                right=mid
            else:
                left=mid
        return right

调用python库函数bisect_left,减少代码量:

具体做法是,调用bisect_left函数,在【0,nums[-1]-nums[0]】中进行查找,寻找的规则是key=check,将中间值mid传入check中,将返回值和p进行比对,调整查找范围,最后返回满足check(mid)>p的最左边的值,也即最小值。

class Solution:
    def minimizeMax(self, nums: List[int], p: int) -> int:
        nums.sort()
        def check(mx:int):
            n=len(nums)
            pair=i=0
            while i<n-1:
                if nums[i+1]-nums[i]>mx:
                    i+=1
                else:
                    i+=2
                    pair+=1
            return pair
        return bisect_left(range(nums[-1]-nums[0]), p, key=check)

总结

猜你喜欢

转载自blog.csdn.net/weixin_45271005/article/details/130189138