通过万岁!!!
- 题目:给两个数组,一个是房子的编号,一个是暖气管道的位置。然后看看暖气管道需要多大的供暖半径才能让所有的房子都感受到暖气(也就是左右两边都在暖气范围之内,在一个就可以了)。当然,我们求的这个半径是越小越好。
- 注意,房子数组中可能是房子在坐标轴上的点,而之间的差距就是两个房子之间的距离。例如,测试用例中给了[1, 5]这是两个房子,之间的距离是4,而这时候暖气只有一个,在2位置,那么需要覆盖1的话,半径为1就行,但是需要覆盖5,半径需要等于3,所以最终结果是3。
- 思路:其实就是找距离房子最近的暖气管道的距离x,然后找这个x中的最大值。思路就是遍历所有的房子,找与我最近的暖气的距离。一开始我的思路错了,所以直接看的题解。我一开始是从暖气管道出发的,这里应该从房子的角度出发。
- 技巧:
- 这里也是采用双指针。
- 首先一个指针i遍历房子,下一个指针j遍历暖气,然后找j和j+1,要求的是管道j离房子i最近。这样就能找到距离i最近的暖气的位置了。
- 因此我们就先需要对两个数组进行排序。
伪代码
首先数组排序
定义返回变量ans
for遍历所有的房子,接下来找每个房子距离最近的暖气管道的位置
记录当前房子和当前管道之间的距离
while,条件是后面的管道离这个房子更近。
那么j++,并获得新的距离,注意这的距离要取新距离和之前距离的最小值
ans = 当前距离和ans的最大值
return ans即可。
java代码
class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int ans = 0;
for (int i = 0, j = 0; i < houses.length; i++) {
int curDistance = Math.abs(houses[i] - heaters[j]);// 当前的距离
// 找距离j最近的管道的位置
while (j < heaters.length - 1 && Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j + 1])) {
j++;
curDistance = Math.min(curDistance, Math.abs(houses[i] - heaters[j]));
}
ans = Math.max(ans, curDistance);
}
return ans;
}
}
- 总结:这个题目有一个巧妙之处,就是定义的j是距离i最近的管道。这一点搞清楚以后,就能明白while循环了。因为我们排序了,所以只要后面离这个房子近,我们就++就可以了。
- 再次附原创链接,代码是copy的人家的,自己加以理解。