供暖气
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。
所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。
说明:
- 给出的房屋和供暖器的数目是非负数且不会超过 25000。
- 给出的房屋和供暖器的位置均是非负数且不会超过10^9。
- 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。
- 所有供暖器都遵循你的半径标准,加热的半径也一样。
示例 1:
输入: [1,2,3],[2]
输出: 1
解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
示例 2:
输入: [1,2,3,4],[1,4]
输出: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
首先第一步,i指向houses数组,j指向heaters数组。
在第一次的while过程中,所有比heater[j]小或等于的houses[i],显然都在heater[j]的左边,那么做差后可以得到距离,这个距离指的是——对每个houses[i]而言,距离右边最近的heaters的距离。
注意!一旦houses【i】 >= heaters[j],就说明已经加热器已经不再房子的右边了。因为,需要找到下一个加热器,因此j++。然后重复上一波操作即可。
在第二次的while中,几乎和上面一样的思路,但是是从后向前遍历。相当于又保存了距离——对于每个房子而言,距离左边最近的加热器的距离。
将左右的距离中选取一个最小的,就是针对每个房子而言最近的加热器距离。
因为加热器的具体在本题中是一致的,因为我们只要找到最大距离即可。
1 import java.util.Arrays; 2 3 class Solution { 4 public int findRadius(int[] houses, int[] heaters) { 5 Arrays.sort(houses); 6 Arrays.sort(heaters); 7 int i=0; 8 int j=0; 9 int[] right=new int[houses.length]; 10 Arrays.fill(right,Integer.MAX_VALUE); 11 while(i<houses.length&&j<heaters.length){ 12 if(houses[i]<=heaters[j]){ 13 right[i]=heaters[j]-houses[i]; 14 i++; 15 }else{ 16 j++; 17 } 18 } 19 i=houses.length-1; 20 j=heaters.length-1; 21 int[] left=new int[houses.length]; 22 Arrays.fill(left,Integer.MAX_VALUE); 23 while(i>=0&&j>=0){ 24 if(houses[i]>=heaters[j]){ 25 left[i]=houses[i]-heaters[j]; 26 i--; 27 }else{ 28 j--; 29 } 30 } 31 int[] res=new int[houses.length]; 32 for(i=0;i<houses.length;i++){ 33 res[i]=Math.min(right[i],left[i]); 34 } 35 int max=Integer.MIN_VALUE; 36 for(i=0;i<res.length;i++){ 37 if(max<res[i]) max=res[i]; 38 } 39 return max; 40 } 41 }
原文地址:https://www.cnblogs.com/kexinxin/p/10280241.html
时间: 2024-10-18 07:05:05