供暖器
- 供暖器
- 题目描述
- 双指针
- 代码演示
- 双指针专题
供暖器
难度 - 中等
leetcode 475
题目描述
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
示例 1:
输入: houses = [1,2,3], heaters = [2]
输出: 1
解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
示例 2:
输入: houses = [1,2,3,4], heaters = [1,4]
输出: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
示例 3:
输入:houses = [1,5], heaters = [2]
输出:3
提示:
1 <= houses.length, heaters.length <= 3 * 1e4
1 <= houses[i], heaters[i] <= 1e9
双指针
其实这个题最核心的解题思想就是,一个房子要么被前面一个供暖站供暖,要么被后面一个供暖站供暖。
怎么确定用哪个来供暖呢,根据题目中要求最小半径,因此比较哪个供暖半径小,选择哪个供暖站,并且记录下半径值。每次记录最小的供暖半径,在总答案中拿最大半径,就是最后要的答案了。
代码流程:
1.首先给房子的集合和供暖器集合排序
2.遍历每个房子,先记录下供暖需要的半径,然后和下一个供暖器之间半径对比,选择半径小的来供暖,
3.全局保留最大的半径。
代码演示
/**
* 计算最短半径
* @param houses
* @param heaters
* @return
*/
public int findRadius(int[] houses, int[] heaters) {
//半径
Arrays.sort(heaters);
Arrays.sort(houses);
int ans = 0;
for (int i = 0,j = 0;i < houses.length;i++){
int r = Math.abs(houses[i] - heaters[j]);
while (j < heaters.length - 1 && Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j + 1])){
j++;
r = Math.min(r,Math.abs(houses[i] - heaters[j]));
}
ans = Math.max(ans,r);
}
return ans;
}
双指针专题
leetcode 881. 救生艇
leetcode870. 优势洗牌