【路飞】供暖器

84 阅读1分钟

记录 1 道算法题

供暖器

leetcode.cn/problems/he…


要求:给出房屋和供暖器的位置,算出供暖器能够覆盖全部房屋的最小半径。每一个供暖器的半径一样。

比如: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
    }