1. 程式人生 > 其它 >2021-12-20每日一題

2021-12-20每日一題

475. 供暖器

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

在加熱器的加熱半徑範圍內的每個房屋都可以獲得供暖。

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

說明:所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。

示例 1:

輸入: houses = [1,2,3], heaters = [2]
輸出: 1
解釋: 僅在位置2上有一個供暖器。如果我們將加熱半徑設為1,那麼所有房屋就都能得到供暖。

示例 2:

輸入: houses = [1,2,3,4], heaters = [1,4]
輸出: 1
解釋: 在位置1, 4上有兩個供暖器。我們需要將加熱半徑設為1,這樣所有房屋就都能得到供暖。

示例 3:

輸入:houses = [1,5], heaters = [2]
輸出:3

提示:

  • 1 <= houses.length, heaters.length <= 3 * 104
  • 1 <= houses[i], heaters[i] <= 109
 1 import java.lang.reflect.Array;
 2 import java.util.Arrays;
 3 
 4 public class FindRadius {
 5     public int findRadius(int[] houses, int[] heaters) {
6 int MAX=-1; 7 //二分查詢排序 8 Arrays.sort(heaters); 9 //遍歷所有房子節點,找到每一個節點最近的加熱站的距離 10 //結果就是所有距離中最大的 11 for (int house : houses) { 12 int index = binsearch(heaters, house); 13 MAX = Math.max(Math.abs(heaters[index] - house), MAX); 14 }
15 return MAX; 16 } 17 18 public int binsearch(int[] num,int target){ 19 int l=0,r=num.length-1; 20 while (l<r){ 21 int mid=(l+r)/2; 22 if (num[mid]==target){ 23 return mid; 24 }else if (num[mid]>target){ 25 //二分查詢注意點,這裡不減1為了找了當前下標大於目標值的點。 26 r=mid; 27 }else if (num[mid]<target){ 28 l=mid+1; 29 } 30 } 31 if (l==0) return l; 32 //判斷當前點和前面那個點哪個距離更近 33 int a=Math.abs(num[l-1]-target),b=Math.abs(num[l]-target); 34 return a<b?l-1:l; 35 } 36 37 public static void main(String[] args) { 38 int[] he={282475249,622650073,984943658,144108930,470211272,101027544,457850878,458777923}; 39 int[] h={823564440,115438165,784484492,74243042,114807987,137522503,441282327,16531729,823378840,143542612}; 40 int[] a={1,5,7,10}; 41 System.out.println(new FindRadius().binsearch(a,11)); 42 System.out.println(new FindRadius().findRadius(he,h)); 43 } 44 }