1. 程式人生 > >Leetcode 475.供暖氣

Leetcode 475.供暖氣

col 重復 import 輸入 turn 數組 tco 暖氣 就是

供暖氣

冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。

現在,給出位於一條水平線上的房屋和供暖器的位置,找到可以覆蓋所有房屋的最小加熱半徑。

所以,你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑。

說明:

  1. 給出的房屋和供暖器的數目是非負數且不會超過 25000。
  2. 給出的房屋和供暖器的位置均是非負數且不會超過10^9。
  3. 只要房屋位於供暖器的半徑內(包括在邊緣上),它就可以得到供暖。
  4. 所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。

示例 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 }

Leetcode 475.供暖氣