475. Heaters

Winter is coming! Your first job during the contest is to design a standard heater with fixed warm radius to warm all the houses.

Now, you are given positions of houses and heaters on a horizontal line, find out minimum radius of heaters so that all houses could be covered by those heaters.

So, your input will be the positions of houses and heaters seperately, and your expected output will be the minimum radius standard of heaters.

Note:

Numbers of houses and heaters you are given are non-negative and will not exceed 25000.
Positions of houses and heaters you are given are non-negative and will not exceed 10^9.
As long as a house is in the heaters' warm radius range, it can be warmed.
All the heaters follow your radius standard and the warm radius will the same.

Example 1:

1
2
3
Input: [1,2,3],[2]
Output: 1
Explanation: The only heater was placed in the position 2, and if we use the radius 1 standard, then all the houses can be warmed.

Example 2:

1
2
3
Input: [1,2,3,4],[1,4]
Output: 1
Explanation: The two heater was placed in the position 1 and 4. We need to use radius 1 standard, then all the houses can be warmed.

解法1:

Array的题目需要总结一下常见的思路。
一般看到array想想:是否需要排序?可以使用双指针?是否可以dp?
这题的思路是,要覆盖所有的房子,那么每一个房子要知道离他最近的heater在哪里。
我们找出所有房子对应的最近的heater的距离,然后再取最大的距离就是我们所求的最小的radius。
我们可以对heaters排序,然后找寻对于每一个house最近的heaters,这里有一点greedy的思想,就是如果i…j对于房子A不是最近的heater,那么对于一个排在房子A之后的房子B,他们也一定不是最近的heaters。
C++

1

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int i = 0, res = 0;
for (int house: houses) {
while (i < heaters.length - 1 && Math.abs(heaters[i] - house) >= Math.abs(heaters[i + 1] - house)) {
i++;
}
res = Math.max(res, Math.abs(heaters[i] - house));
}
return res;
}
}