文章目录
- 题目描述
- 思路分析
- 完整代码:
题目描述
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 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
思路分析
这道题可能题目描述的不是特别清楚,可以看看后面的示例,一下就明白了。
两个关键点:
- 对于每个房子,找他前面一个和后面一个取暖器。取其较近的。
- 对于所有房屋,取上述最大的距离作为答案即可。
首先要对两个数组数据进行排序。
然后我们要找到当前房屋处于那两个取暖器之间,这里如果使用暴力后面会超时,所以之里使用二分法找。
完整代码:
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
houses.sort()
heaters.sort()
res = [] # 记录所有房屋得到供暖的最小距离
for i in range(len(houses)):
if houses[i] in heaters: # 当前房屋可以被暖气覆盖,不需要考虑他的距离。
continue
else: # 当前房屋不一定会被覆盖,考虑一下距离
left = 0
right = len(heaters)-1
# 二分法找离该数最近的俩数之间小的那个
while left < right:
mid = (left+right)//2
if heaters[mid] == houses[i]:
break
elif heaters[mid] > houses[i]:
right = mid
else:
left = mid+1
res.append(min(abs(houses[i]-heaters[left-1]),abs(houses[i]-heaters[right])))
return 0 if len(res) == 0 else max(res)