Heaters,LeetCode,475

题目描述: 你有一个带有加热器的房间,现在你想找出加热器的最小加热半径,使得房间内的每个位置都能被至少一个加热器覆盖。

输入

  • houses:一个整数数组,表示房间内每个位置的距离(可以是任意顺序)。
  • heaters:一个整数数组,表示每个加热器的位置(可以是任意顺序)。

输出

  • 一个整数,表示所需的最小加热半径。

示例

输入: houses = [1,2,3], heaters = [2] 输出: 1 解释: 仅在位置2放置一个加热器,其加热半径为1即可覆盖所有房屋。

解题思路

  1. 排序:首先对 housesheaters 进行排序,以便后续处理。
  2. 二分查找:对于每个房屋,使用二分查找找到离它最近的加热器。
  3. 计算半径:计算每个房屋到最近加热器的距离,这些距离中的最大值即为所需的最小加热半径。

详细步骤

  1. 排序houses.sort() heaters.sort()
  2. 二分查找
    • 对于每个房屋 house,使用二分查找在 heaters 中找到离它最近的加热器。
    • 二分查找的目的是找到一个位置 i,使得 heaters[i] 是离 house 最近的加热器。
  3. 计算半径
    • 对于每个房屋,计算它到最近加热器的距离。
    • 更新最小加热半径为这些距离中的最大值。

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),除了输入数组外,使用的额外空间为常数。

总结: 通过排序和二分查找,我们可以高效地找到每个房屋到最近加热器的距离,从而确定所需的最小加热半径。这种方法在处理大量数据时表现良好,具有较高的效率。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注