0
点赞
收藏
分享

微信扫一扫

leetcode(力扣) 475. 供暖器 (二分法)


文章目录

  • ​​题目描述​​
  • ​​思路分析​​
  • ​​完整代码:​​

题目描述

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

在加热器的加热半径范围内的每个房屋都可以获得供暖。

现在,给出位于一条水平线上的房屋 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)


举报

相关推荐

0 条评论