冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
我自己写没注意length,写了个ON^2暴力遍历,只能说属于是铸币了,不过确实如果这题双重遍历就能拿下的话,也就是个easy难度了,看看Length,考虑到TLE的条件一般在运算10^8以下,所以我们考虑到应该采取O(NlogN)复杂度的算法,二重循环都是暴力遍历所以是O(N^2),将其中一层改为二分查找即可O(logN),这样就可以AC了
class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int l = 0, r = (int) 1e9;
//r为当前的rad值,然后进行检查,如果保证可以覆盖所有房子则返回真,否则返回假
//如果可以覆盖,尝试缩小半径
//如果不能覆盖,需要增大半径
while (l < r) {
int mid = l + r >> 1;
if (check(houses, heaters, mid)) r = mid;
else l = mid + 1;
}
return r;
}
boolean check(int[] houses, int[] heaters, int x) {
int n = houses.length, m = heaters.length;
for (int i = 0, j = 0; i < n; i++) {
while (j < m && houses[i] > heaters[j] + x) j++;
//可以覆盖则继续检查
if (j < m && heaters[j] - x <= houses[i] && houses[i] <= heaters[j] + x) continue;
//有一个不能覆盖都返回假
return false;
}
return true;
}
}