这道题读题读了半天,大致意思是。给两个数组,第一个数组表示房间的位置,第二个表示加热器的位置,然后想通过设置加热器覆盖的半径来让所有屋子都被加热器覆盖。
第一种方法就是找到每个屋子毗邻的加热器,然后再得到所需要最小半径。
public class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int res = 0;
for (int house: houses) {
int i = 0;
while (i < heaters.length - 1 && heaters[i] + heaters[i + 1] < house * 2) {
i++;
}
res = Math.max(res, Math.abs(heaters[i] - house));
}
return res;
}
}
发现一种更快的方法,用二分查找。对heaters进行sort,然后得到某个house的相对位置。再计算左右的距离。
public class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(heaters);
int res = -1;
for (int house : houses) {
int index = Arrays.binarySearch(heaters, house);
if (index < 0) {
index = -(index + 1);
}
int distL = index - 1 >= 0 ? house - heaters[index - 1] : Integer.MAX_VALUE;
int distR = index < heaters.length ? heaters[index] - house : Integer.MAX_VALUE;
res = Math.max(res, Math.min(distL, distR));
}
return res;
}
}