冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
思路:房屋左右侧的热水器,取距离小的那个,最终取的是所有房屋所需最大的那个半径。
首先对数组进行排序。
对房屋进行遍历,首先定义半径radio,供暖器的下标i,并初始化。
接下来遍历房屋,找到房屋左右侧的最小距离的供暖器。
找房屋右侧的供暖器。也就是遍历供暖器了
接下来分析供暖器的位置。有3种可能,供暖器在i == 0;供暖器i下标在heater.length的位置,供暖器的i在houses数组下标之间。
1、供暖器的位置在i == 0的位置
比如这种:houses[1,2,3,4,5,6,7],heaters[3,6], 此时heaters[0] = 3 ,3-1 = 2
2、 i == heaters.length说明i已经超出数组的范围了, 也就是i下标的供暖器是最后一个供暖器,此时需要比较加热半径radio和(houses[houses.length - 1] - heaters[heaters.length - 1]), 比如这种:houses[1,2,3,4,5,6,7,8,9],heaters[3,6],当i = 6的时候,houses后面还有一个7,8,9
3、要不然就是供暖器在房子左右两侧,比如: houses[1,2,3,4,5],heaters[2,5],此时i = 1,heaters[i] = 5,当house = 3的时候,当然取离供暖器2,5距离的最小值。5 - 3 = 2;3 - 2 = 1,取1
具体代码:
找一个例子模拟下:
houses[1,2,3,4,5,6,7],heaters[3,6]
import java.util.*;
// 供暖器的最小加热半径
// 计算房屋左右侧的最小供暖器的距离,然后求出整个房屋求出房屋和供暖器的最大距离。
class Solution {
public int findRadius(int[] houses, int[] heaters) {
// 对houses,heaters进行排序
Arrays.sort(houses);
Arrays.sort(heaters);
// 初始化加热半径和加热器的下标
int radio = 0;
int i = 0;
// 遍历房屋,找到房屋左右侧的最小距离的供暖器
for(int house:houses){
// 先找到房屋右侧的供暖器
while(i < heaters.length && house > heaters[i]){
i++;
}
// 有3种可能,供暖器在i == 0;供暖器i下标在heater.length的位置,供暖器的i在houses数组下标之间
// 1、供暖器的位置在i == 0的位置
if(i == 0){
// 比如这种:houses[1,2,3,4,5,6,7],heaters[3,6],
// 此时heaters[0] = 3 ,3-1 = 2
radio = Math.max(radio,heaters[i] - house);
}else if(i == heaters.length){
// i == heaters.length说明i已经超出数组的范围了
// 也就是i下标的供暖器是最后一个供暖器
// 此时需要比较加热半径radio和(houses[houses.length - 1] - heaters[heaters.length - 1])
// 比如这种:houses[1,2,3,4,5,6,7,8,9],heaters[3,6],当i = 6的时候,houses后面还有一个7,8,9
return Math.max(radio,houses[houses.length - 1] - heaters[heaters.length - 1]);
}else{
// 要不然就是供暖器在房子左右两侧
// 比如: houses[1,2,3,4,5],heaters[2,5],此时i = 1,heaters[i] = 5,
// 当house = 3的时候,当然取离供暖器2,5距离的最小值。5 - 3 = 2;3 - 2 = 1,取1
radio = Math.max(radio,Math.min(heaters[i] - house,house - heaters[i - 1]));
}
}
return radio;
}
}