冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

在加热器的加热半径范围内的每个房屋都可以获得供暖。

现在,给出位于一条水平线上的房屋 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
  • 二分查找
  • \n
  • 👍 199
  • 👎 0
  • 题解:

    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;
        }
    
    }