题目描述: 你有一个带有加热器的房间,现在你想找出加热器的最小加热半径,使得房间内的每个位置都能被至少一个加热器覆盖。
输入:
houses
:一个整数数组,表示房间内每个位置的距离(可以是任意顺序)。heaters
:一个整数数组,表示每个加热器的位置(可以是任意顺序)。
输出:
- 一个整数,表示所需的最小加热半径。
示例:
输入: houses = [1,2,3], heaters = [2]
输出: 1
解释: 仅在位置2放置一个加热器,其加热半径为1即可覆盖所有房屋。
解题思路:
- 排序:首先对
houses
和heaters
进行排序,以便后续处理。 - 二分查找:对于每个房屋,使用二分查找找到离它最近的加热器。
- 计算半径:计算每个房屋到最近加热器的距离,这些距离中的最大值即为所需的最小加热半径。
详细步骤:
- 排序:
houses.sort() heaters.sort()
- 二分查找:
- 对于每个房屋
house
,使用二分查找在heaters
中找到离它最近的加热器。 - 二分查找的目的是找到一个位置
i
,使得heaters[i]
是离house
最近的加热器。
- 对于每个房屋
- 计算半径:
- 对于每个房屋,计算它到最近加热器的距离。
- 更新最小加热半径为这些距离中的最大值。
Python代码实现:
def findRadius(houses, heaters):
import bisect
houses.sort()
heaters.sort()
def findClosestHeater(house):
# 使用二分查找找到最近的加热器
idx = bisect.bisect_left(heaters, house)
if idx == 0:
return heaters[0]
if idx == len(heaters):
return heaters[-1]
# 比较左右两个加热器,返回最近的
if abs(heaters[idx] - house) < abs(heaters[idx - 1] - house):
return heaters[idx]
else:
return heaters[idx - 1]
min_radius = 0
for house in houses:
closest_heater = findClosestHeater(house)
min_radius = max(min_radius, abs(closest_heater - house))
return min_radius
示例
houses = [1, 2, 3] heaters = [2] print(findRadius(houses, heaters)) # 输出: 1
复杂度分析:
- 时间复杂度:O(N log M),其中 N 是房屋的数量,M 是加热器的数量。排序的时间复杂度为 O(N log N + M log M),二分查找的时间复杂度为 O(N log M)。
- 空间复杂度:O(1),除了输入数组外,使用的额外空间为常数。
总结: 通过排序和二分查找,我们可以高效地找到每个房屋到最近加热器的距离,从而确定所需的最小加热半径。这种方法在处理大量数据时表现良好,具有较高的效率。
发表回复