题目描述:
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。
所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。
思路分析:
(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
私信
关注