光看数据量可以知道一定要用二分法了。
考虑示例2,对于每个house的位置,我们需要找到最近的heater的位置,可以知道用二分法比较方便。(前提先对heaters排个序,题目没说有序)
接下来考虑二分的边界条件,因为是前插,举个例子2应该插在【1,3,5,7】的第1的位置。
因此只需要分别考虑最左边,最右边和处于中间的情况。
class Solution:
def findRadius(self, houses: List[int], heaters: List[int]) -> int:
from bisect import bisect_left
heaters.sort()
ret=0
for h in houses:
i=bisect_left(heaters,h)
if i==0:
d=abs(heaters[i]-h)
elif i>=len(heaters):
d=abs(heaters[-1]-h)
else:
d=min(abs(heaters[i]-h),abs(heaters[i-1]-h))
ret=max(ret,d)
return ret
然后不断扩大最小半径,就得到答案。