[抄题]:算法
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.ide
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:spa
Example 1:debug
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:3d
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.
[暴力解法]:code
时间分析:blog
空间分析:input
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
[思惟问题]:
the straight-forward check whether the next heater is closer than the current. Then I thought I probably don't need abs
if I just use
while heaters[i+1] - x <= x - heaters[i]:更近
That's obviously correct if x
is between the heaters, because then that's the correct distances of x
to the two heaters. Less obviously (but imho not surprisingly) it's also correct if x
isn't between them. Finally, after rewriting it to
while heaters[i] + heaters[i+1] <= 2 * x
[一句话思路]:
头回见 不知道什么才是“覆盖所有”的最小距离:
每一个house都取最小距离求并集(最大距离)便可
[输入量]:空: 正常状况:特大:特小:程序里处理到的特殊状况:异常状况(不合法不合理的输入):
[画图]:
[一刷]:
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
[复杂度]:Time complexity: O(n) Space complexity: O(1)
[英文数据结构或算法,为何不用别的数据结构或算法]:
更新以后用i
for (int house : houses) { while (i < heaters.length - 1 && heaters[i + 1] + heaters[i] <= 2 * house) { i++; } res = Math.max(res, Math.abs(heaters[i] - house)); }
[关键模板化代码]:
[其余解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
class Solution { public int findRadius(int[] houses, int[] heaters) { //ini: sort Arrays.sort(houses); Arrays.sort(heaters); int res = Integer.MIN_VALUE, i = 0; //update for (int house : houses) { while (i < heaters.length - 1 && heaters[i + 1] + heaters[i] <= 2 * house) { i++; } res = Math.max(res, Math.abs(heaters[i] - house)); } return res; } }