题目
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
代码
对于每一个房屋找到离得最近的供暖器,计算间距,最后计算这些间距的最大值,即为最小供暖半径。
由于题目给出的房屋和供暖器位置未必按顺序,首先要重新升序排序。再利用bisect_left
函数二分查找最近的供暖器位置,要注意这个位置可能在最后一个供暖器之后,这说明最后一个供暖器就是所求。
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
houses_n=len(houses) # 房屋数量
heaters_n=len(heaters) # 供暖器数量
heaters=sorted(heaters) # 位置升序排序
houses=sorted(houses)
# 如果只有一个供暖器,取供暖器到第一个房屋和最后一个房屋距离的最大值
if heaters_n==1:
return max(abs(houses[0]-heaters[0]),abs(houses[-1])-heaters[0])
# dp[i]计算houses[i]离取暖器的最近距离
dp=[0]*houses_n
# bisect_left 查找最近的取暖器
for i in range(houses_n):
k=bisect_left(heaters,houses[i])
if 0<k<heaters_n-1:
dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k-1]),abs(houses[i]-heaters[k+1]))
elif k==heaters_n-1:
dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k-1]))
elif k==heaters_n:
dp[i]=houses[i]-heaters[-1]
elif k==0:
dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k+1]))
return max(dp)