leetcode刷题日记-供暖器

  • 题目描述:

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

  • 示例:
    输入: houses = [1,2,3], heaters = [2]
    输出: 1
    解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。

  • 解析,这个题目的考点是二分查找的运用,但是难点是如何正确的二分查找和正确的运用。我们这么来理解这个题目,题目要求是给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。首先,我们要保证所有的房屋都能够被供暖器覆盖,因此我们要对房屋进行遍历,同时一个房屋可能左右各有一个供暖器(这也是大部分情况,只有左(右)供暖器的需要单独考虑),那么每个房屋必然存在两个属性,即离最近左边供暖器的距离和最近右边供暖器的距离,我们理所当然的取最小的距离作为该房子的最小供暖距离,但是由于需要保证所有房子均被供暖器覆盖,所以在所有房子中,我们需要最最大距离作为最后的结果,那么到这里,二分查找的应用就出来了,用于查找房子i在heaters中的插入位置,得到离他最近的两个供暖器。代码如下:

class Solution:
    def findRadius(self, houses: List[int], heaters: List[int]) -> int:
        """
        给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返
        回可以覆盖所有房屋的最小加热半径
        >>>self.findRadius([1,2,3,4], [1,4])
        >>>1
        """
        heaters.sort()
        temp = 10**9+1 #1 <= houses[i], heaters[i] <= 10**9
        radius = 0
        for h in houses:
            hIndex = bisect.bisect_right(heaters, h)
            radius_left = h - heaters[hIndex-1] if hIndex>0 else temp
            radius_right = heaters[hIndex] - h if hIndex<len(heaters) else temp
            radius_c = min(radius_left, radius_right)
            radius = max(radius, radius_c)
        return radius
  • 时间复杂度:O((n+m) log n),其中 m 是数组houses 的长度,n 是数组heaters的长度。对数组heaters 排序需要 O(n log n) 的时间。使用二分查找对每个房屋寻找距离最近的供暖器,每次二分查找需要 O(log n) 的时间,有 m 个房屋,因此需要 O(m log n) 的时间。总时间复杂度是 O((n+m) log n)。
  • 空间复杂度:O(log n),其中 n 是数组heaters的长度。空间复杂度主要取决于排序所需要的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon_tttea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值