每日一题leetcode475.供暖器

461 篇文章 1 订阅

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

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

现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。

说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
在这里插入图片描述
思路:
排序+二分查找,

  • 对每个房屋,更新位于其前后的取暖器 与该房屋之间的最小距离,cur=min(left_dis,right_dis)
  • 更新最小半径,res=max(res,cur)

解答:

class Solution:
    def findRadius(self, houses: List[int], heaters: List[int]) -> int:
        res=0
        heaters.sort()
        for house in houses:
            #找到heaters[i]>=house的最小i,若不存在返回len(heaters)
            j=bisect_right(heaters,house)
            #找到heaters[i]<house的最大i
            i=j-1
            right_dis=heaters[j]-house if j<len(heaters) else float("inf")
            left_dis=house-heaters[i] if i>=0 else float("inf")
            #对于每个房屋,要么用前面的暖气,要么用后面的暖气,取最近的用
            cur=min(right_dis,left_dis)
            #要求能覆盖所有房屋的最小加热半径,故需取最大值
            res=max(res,cur)
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值