475.供暖器(Medium)
题目描述
现在,给出位于一条水平线上的房屋 houses
和供暖器 heaters
的位置,在加热器的加热半径范围内的每个房屋都可以获得供暖。请你找出 并返回可以覆盖所有房屋的最小加热半径。
样例
Input: houses = [1,2,3,4], heaters = [1,4]
Output: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
题解
需要两次遍历,第一次遍历 house
,再从 heaters
第二次遍历中找到离 house
最近的加热器,得到半径。
所有 house
的半径的最大值一定是我们的最小加热半径。
这里从 heaters
找到加热器的过程可以通过折半查找优化。
Python 代码示 例
# 两次遍历,Python 超时
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
radis = -1
for house in houses:
house_distance = min(abs(heater - house) for heater in heaters)
radis = max(radis, house_distance)
return radis
# 折半查找
import math
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
def findNearnest(house):
left, right = 0, len(heaters) - 1
while left < right:
mid = (left + right ) >> 1
if heaters[mid] < house:
left = mid + 1
else:
right = mid
# left 为第一个大于house的值,离 house 最近的一定是 left 和 left - 1
dist1 = abs(heaters[left] - house) if left < len(heaters) else math.inf # 处理边界值
dist2 = abs(heaters[left - 1] - house) if left > 0 else math.inf
return min(dist1, dist2)
heaters.sort()
radis = -1
for house in houses:
house_distance = findNearnest(house)
if house_distance > radis:
radis = house_distance
return radis