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)
总结
。