题目描述
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
说明
1 <= houses.length, heaters.length <= 3 * 104 1 <= houses[i], heaters[i] <= 109
|
示例
输入: houses = [1,2,3], heaters = [2] 输出: 1 解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
输入: houses = [1,2,3,4], heaters = [1,4] 输出: 1 解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
输入:houses = [1,5], heaters = [2] 输出:3
|
暴力解法
分析:排序后从左开始遍历每一个房屋,求每个房屋到最近供暖器的距离,然后找出最大的值。
求每个房屋到最近供暖器的距离:相邻的左边供暖器和右边供暖器距离里取小的值。
func findRadius(houses []int, heaters []int) int { var ( radius int i int j int ) sort.Ints(houses) sort.Ints(heaters) t := 0 for j = 0; j < len(houses); j++ { tmp := 0 for i = t; i < len(heaters); i++ { if heaters[i] < houses[j] { tmp = houses[j] - heaters[i] } else if tmp != 0 { tmp = int(math.Min(float64(tmp), float64(heaters[i]-houses[j]))) if i != 0 { t = i - 1 } break } else { tmp = heaters[i] - houses[j] if i != 0 { t = i - 1 } break } } radius = int(math.Max(float64(radius), float64(tmp))) } return radius }
|
本地测试
package main
import ( "fmt" )
func main() { var a, b []int a = []int{1, 2, 3} b = []int{2} fmt.Println(findRadius(a, b))
a = []int{1, 2, 3, 4} b = []int{1, 4} fmt.Println(findRadius(a, b))
a = []int{1, 5} b = []int{2} fmt.Println(findRadius(a, b))
a = []int{282475249, 622650073, 984943658, 144108930, 470211272, 101027544, 457850878, 458777923} b = []int{823564440, 115438165, 784484492, 74243042, 114807987, 137522503, 441282327, 16531729, 823378840, 143542612} fmt.Println(findRadius(a, b)) }
|
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/heaters