其他分享
首页 > 其他分享> > 供暖器

供暖器

作者:互联网

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

现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。

所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。

思路分析:
(1)先找到每个房屋离加热器的最短距离(即找出离房屋最近的加热器)存储在一个数组中;
(2)在所有距离中选出最大的一个即为最小覆盖半径。即为将数组排序后,最后一个元素。

二分查找的思路
针对每个房屋都有四中可能性
1,房屋的位置刚好有一个加热器,那么加热器离房屋的距离就是0
2,房屋的左边没有加热器,右边有加热器,那最小距离是:加热器位置 - 房屋的位置
3,房屋的左边有加热器,右边没有,那最小距离是:房屋的位置 - 加热器的位置
4,房屋的左右都有加热器,那最小距离是: Min(房屋离左侧加热器的距离,房屋离右侧加热器的距离)

class Solution {
    public int findRadius(int[] houses, int[] heaters) {
        Arrays.sort(heaters);
        int len=houses.length;
        int len1=heaters.length;
        int[] distances = new int[len];
        for (int i = 0; i < len; i++) {
            int left = 0;
            int right = len1 - 1;
            while (left < right) {
                int mid = (left + right + 1) >>> 1;
                if (heaters[mid] > houses[i]) {
                    right = mid - 1;
                } else {
                    left = mid;
                }
            }
            if (heaters[left] == houses[i]) {
                distances[i] = 0;
            } else if (heaters[left] > houses[i] && left == 0) {
                distances[i] = heaters[left] - houses[i];
            } else if (heaters[left] < houses[i] && left == len1 - 1) {
                distances[i] = houses[i] - heaters[left];
            } else {
                distances[i] = Math.min((heaters[left + 1] - houses[i]), (houses[i] - heaters[left]));
            }
        }

        Arrays.sort(distances);
        return distances[len- 1];
    }
}
ZQQ~BK 发布了100 篇原创文章 · 获赞 12 · 访问量 2035 私信 关注

标签:heaters,供暖,int,加热器,houses,房屋,left
来源: https://blog.csdn.net/qq_42174669/article/details/104094893