冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses
和供暖器 heaters
的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
示例 1:
输入: houses = [1,2,3], heaters = [2] 输出: 1 解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
示例 2:
输入: houses = [1,2,3,4], heaters = [1,4] 输出: 1 解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
示例 3:
输入:houses = [1,5], heaters = [2] 输出:3
提示:
1 <= houses.length, heaters.length <= 3 * 104
1 <= houses[i], heaters[i] <= 109
Related Topics
题解:
public class LeetCode475Test {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(heaters);
Arrays.sort(houses);
int res = 0;
for (int house : houses) {
int l = 0;
int r = heaters.length - 1;
//二分法,这边有点疑问,找到的应该是比较接近的那个,
while (l < r) {
int mid = (l + r) >> 1;
if (heaters[mid] == house) {
l = mid;
break;
}
if (heaters[mid] > house) {
r = --mid;
} else {
l = ++mid;
}
}
int dis = Integer.MAX_VALUE;
//二分法比较头疼的部分,边界问题,所以这边取了个巧,再拿前1后1和得到的这个位置做对比
for (int i = l - 1; i <= l + 1; i++) {
if (i >= 0 && i <= heaters.length - 1) {
dis = Math.min(dis, Math.abs(house - heaters[i]));
}
}
//得到每个房屋对应的最小的距离,再取所有房屋的最小值里最大的值
res = Math.max(res, dis);
}
return res;
}
}
发表评论