475 供暖器 【python3】

题目

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。

说明:所有供暖器都遵循你的半径标准,加热的半径也一样。

代码

对于每一个房屋找到离得最近的供暖器,计算间距,最后计算这些间距的最大值,即为最小供暖半径。
由于题目给出的房屋和供暖器位置未必按顺序,首先要重新升序排序。再利用bisect_left函数二分查找最近的供暖器位置,要注意这个位置可能在最后一个供暖器之后,这说明最后一个供暖器就是所求。

class Solution:
    def findRadius(self, houses: List[int], heaters: List[int]) -> int:
        houses_n=len(houses) # 房屋数量
        heaters_n=len(heaters) # 供暖器数量

        heaters=sorted(heaters) # 位置升序排序
        houses=sorted(houses)

        # 如果只有一个供暖器,取供暖器到第一个房屋和最后一个房屋距离的最大值
        if heaters_n==1:
            return max(abs(houses[0]-heaters[0]),abs(houses[-1])-heaters[0])
        # dp[i]计算houses[i]离取暖器的最近距离
        dp=[0]*houses_n
        # bisect_left 查找最近的取暖器
        for i in range(houses_n):
            k=bisect_left(heaters,houses[i])
            if 0<k<heaters_n-1:
                dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k-1]),abs(houses[i]-heaters[k+1]))
            elif k==heaters_n-1:
                dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k-1]))
            elif k==heaters_n:
                dp[i]=houses[i]-heaters[-1]
            elif k==0:
                dp[i]=min(abs(houses[i]-heaters[k]),abs(houses[i]-heaters[k+1]))

        return max(dp)

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值