Heaters

这个题的二分思维很扭曲,首先明白一点,如果一个房子在两个火炉之间,则我们必然去找离它近的那个火炉来覆盖它,但是如果有另一个房子也在这两个火炉之间且要覆盖这个房子的距离是大于之前那个的,则我们必然要在这两个距离中取最大值这样才能满足题目条件,举个例子可能更容易理解,比如火炉在1,100两个位置,现在有一个房子在40这个位置,则明显的如果只有这一个房子我们要满足的最小距离只需要min(abs(1 - 40), abs(100 - 40)) = 39就行了,但是问题是如果又有一个50的房子呢?那对于这个50的房子我们能去的最小距离是49,那如果要同时覆盖这两个房子,明显我们就只能把覆盖距离提到49了,也就是说,这道题在每个房子的两侧取最小距离,在房子与房子之间要取最大值,而此题的二分就是拿房子位置去火炉位置里面找它应该放的位置,这样来计算距离,这道题怎么看都不是一个easy的题

class Solution(object):
    def findRadius(self, houses, heaters):
        """
        :type houses: List[int]
        :type heaters: List[int]
        :rtype: int
        """
        result = 0
        n = len(heaters)
        heaters.sort()
        for house in houses:
            index = bisect.bisect_left(heaters, house)
            a, b = sys.maxint, sys.maxint
            if index - 1 >= 0:
                a = abs(house - heaters[index - 1])
            if index < n:
                b = abs(house - heaters[index])
            result = max(min(a, b), result)
        return result

results matching ""

    No results matching ""