记录 1 道算法题
供暖器
要求:给出房屋和供暖器的位置,算出供暖器能够覆盖全部房屋的最小半径。每一个供暖器的半径一样。
比如:houses = [1,2,3], heaters = [2]
, 输出:1
我们需要比较出房屋与他前后相近的供暖器之间的距离,然后保存最小的距离,然后将这个距离与半径比较,保留最大的值作为半径。
这样只需要关注每一个房屋能否被覆盖到,每一个被覆盖到了,全部也就被覆盖到了,这时候最大的半径就是保底的值。
当前面的供暖器大于后面的供暖器时,意味着对于接下来的房屋,前面的供暖器都不适宜提供服务。所以可以省略掉这部分供暖器。并且由于房子只使用相近的供暖器,所以要保持供暖器随着房子更新下标,不需要遍历全部供暖器。
完整代码如下:
function findRadius(houses, heaters) {
// 半径
let res = 0
// 处理
let j = 0
for(let i = 0; i < houses.length; i++) {
// 当前的房子
const house = houses[i]
// 当前房子与供暖器的距离
let distance = Math.abs(house - heaters[j])
// 当房子后面的供暖器距离比前面小的时候,可以淘汰掉前面的供暖器
while(j < heaters.length && Math.abs(house - heaters[j]) >= Math.abs(house - heaters[j + 1])) {
j++
// 同时把当前房子与供暖器的距离更新
distance = Math.min(distance, Math.abs(house - heaters[j]))
}
// 一直保留最大距离作为半径
res = Math.max(res, distance)
}
return res
}