又是周一了,我们来做题。
力扣-475 供暖器https://leetcode-cn.com/problems/heaters/submissions/今天的题目很有意思,确实像是现实中会碰到的问题的一个简化模型。
思路:
题目没有提到两个数组是否有序,所以习惯地先进行了排序。类似的问题基本上都是有序数组才能进行处理。
要保证每个房子都会被供暖器覆盖,那么遍历每个房子,计算该房子到距离它最近的一前一后两个供暖器之间的距离,将两个距离中较近的那个做为我们选取的取暖器(很符合现实);而如果离它最近的只有一个那便没得选。遍历结束后,我们计算得出的这些距离里,为了保证每个房子都能覆盖,取其中最大距离即可满足。
代码如下:
package cn.daycode.leetcode;
import java.util.Arrays;
public class FindRadius {
public static void main(String[] args) {
Solution s = new Solution();
int[] houses = {1,1,1,1,1,1,999,999,999,999,999};
int[] heaters = {499,500,501};
System.out.println(s.findRadius(houses,heaters));
}
}
class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses); // 题目没有说这俩数组是有序的,姑且先排个序
Arrays.sort(heaters);
int i = 0; // 记录房子遍历的下标
int j = 0; // 记录暖气遍历的下标
int maxDis = 0; // 记录目前的取暖器供暖需要的最大距离
while(i < houses.length){ // 遍历所有房屋
// 取该房子左右两侧的供暖器(如果有)与该房屋的距离,取较小者
if(heaters.length == 1){ // 只有一个取暖器的情况
maxDis = Math.max(Math.abs(heaters[j]-houses[i]), maxDis);
i++;
}else if(j == 0) { // 特殊情况:多个取暖器的第一个取暖器
// 第一个取暖器比但钱房屋值大则计算其距离否则看下一个取暖器
if (heaters[j] >= houses[i]) {
maxDis = Math.max(heaters[j] - houses[i], maxDis);
i++;
} else {
j++;
}
}else {
// 普遍情况:房子在两个取暖器之间,取其中较短距离的取暖器供暖并计算距离
if(heaters[j] >= houses[i] && heaters[j - 1] < houses[i]){
int temp = Math.min(heaters[j] - houses[i], houses[i] - heaters[j - 1]);
maxDis = Math.max(temp, maxDis);
i++;
}else {
// 如果房子不在两个取暖器之间,后面还有取暖器就下一个,否则只能用最后一个取暖器了
if( j == heaters.length-1){
maxDis = Math.max(houses[i]-heaters[j], maxDis);
i++;
}else{
j++;
}
}
}
}
return maxDis;
}
}