【Leetcode】475. Heaters

class Solution(object):

    def findRadius(self, houses, heaters):

        """

        :type houses: List[int]

        :type heaters: List[int]

        :rtype: int

        """

        heaters.sort()

        r = 0

        for house in houses:

            pos = bisect.bisect_left(heaters, house)

            if pos==0:

                r = max(heaters[pos]-house, r)

            elif pos==len(heaters):

                r = max(house-heaters[-1], r)

            else:

                r = max(r, min(house-heaters[pos-1], heaters[pos]-house))

        return r

1 先对house和heaters进行排序,对于每一个house,只需要比较它左边heater的radius和它右边heater的radius,取最小的那个

2 还有两种特殊情况:第一是第一个heater左边的house只能被这个heater供热,第二是最后一个heater右边的house只能被这最后一个heater供热

3 得到所有house的最小半径后,从这所有最小半径中选取最大的那个半径,就是题目所求

4 只需要对heaters进行排序,然后对每一个house进行binary search

5 因为我们是要得到最大半径,所以我们需要维护一个全局变量r,每次和局部得到的r进行对比

6  r = max(house-heaters[-1], r) 不能写成heaters[pos]会出index out of range的错误,这里对于heaters来说,就取最后一个元素就行了

7 r = max(r, min(house-heaters[pos-1], heaters[pos]-house))  里面是有比较左边的和右边的,需要选它们俩中小的那个

8 r = max(r, min(house-heaters[pos-1], heaters[pos]-house)) 中插入house,其左边的heater距离是house-heaters[pos-1],右边的heater半径是heaters[pos]-house,因为bisect.bisect_left只是返回位置,并没有时间将house插入进去,所以它右边的heater还是在pos这个位置上

你可能感兴趣的:(【Leetcode】475. Heaters)