题目描述
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
示例 1:
输入: houses = [1,2,3], heaters = [2]
输出: 1
解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
示例 2:
输入: houses = [1,2,3,4], heaters = [1,4]
输出: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
示例 3:
输入:houses = [1,5], heaters = [2]
输出:3
提示:
- 1 <= houses.length, heaters.length <= 3 * 104
- 1 <= houses[i], heaters[i] <= 109
题解思路
-
我们将房子和加热器以升序排序
-
找到每个房子以及离其最近的加热器 计算他们两的距离作为半径
- 找到离其最近的加热器是为了计算最短半径
-
遍历完所有的房子 找到其中的最大值
-
这样每个房子都会被加热器覆盖到
题解代码
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
ans,i,j=0,0,0
heaters+=[-inf,inf]
heaters.sort()
houses.sort()
while i<len(houses):
cur=inf
#找到每个房子离其最近的加热器并计算距离
while heaters[j]<=houses[i]:
cur=(houses[i]-heaters[j])
j+=1
cur=min(cur,heaters[j]-houses[i])
#在所有最小的半径中找到最大值 为了使所有的房子都覆盖到加热
ans=max(cur,ans)
j-=1
i+=1
return ans