website/content/ChapterFour/0400~0499/0475.Heaters.md
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:
Example 1:
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:
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.
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。
说明:
package leetcode
import (
"math"
"sort"
)
func findRadius(houses []int, heaters []int) int {
minRad := 0
sort.Ints(heaters)
for _, house := range houses {
// 遍历房子的坐标,维护 heaters 的最小半径
heater := findClosestHeater(house, heaters)
rad := heater - house
if rad < 0 {
rad = -rad
}
if rad > minRad {
minRad = rad
}
}
return minRad
}
// 二分搜索
func findClosestHeater(pos int, heaters []int) int {
low, high := 0, len(heaters)-1
if pos < heaters[low] {
return heaters[low]
}
if pos > heaters[high] {
return heaters[high]
}
for low <= high {
mid := low + (high-low)>>1
if pos == heaters[mid] {
return heaters[mid]
} else if pos < heaters[mid] {
high = mid - 1
} else {
low = mid + 1
}
}
// 判断距离两边的 heaters 哪个更近
if pos-heaters[high] < heaters[low]-pos {
return heaters[high]
}
return heaters[low]
}
// 解法二 暴力搜索
func findRadius1(houses []int, heaters []int) int {
res := 0
for i := 0; i < len(houses); i++ {
dis := math.MaxInt64
for j := 0; j < len(heaters); j++ {
dis = min(dis, abs(houses[i]-heaters[j]))
}
res = max(res, dis)
}
return res
}