111、供暖器
阿新 • • 發佈:2018-12-23
冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。
現在,給出位於一條水平線上的房屋和供暖器的位置,找到可以覆蓋所有房屋的最小加熱半徑。
所以,你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑。
說明:
- 給出的房屋和供暖器的數目是非負數且不會超過 25000。 給出的房屋和供暖器的位置均是非負數且不會超過10^9。
- 只要房屋位於供暖器的半徑內(包括在邊緣上),它就可以得到供暖。
- 所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。只要房屋位於供暖器的半徑內(包括在邊緣上),它就可以得到供暖。 所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。只要房屋位於供暖器的半徑內(包括在邊緣上),它就可以得到供暖。 所有供暖器都遵循你的半徑標準,加熱的半徑也一樣。
示例 1:
輸入: [1,2,3],[2]
輸出: 1
解釋: 僅在位置2上有一個供暖器。如果我們將加熱半徑設為1,那麼所有房屋就都能得到供暖。
示例 2:
輸入: [1,2,3,4],[1,4]
輸出: 1
解釋: 在位置1, 4上有兩個供暖器。我們需要將加熱半徑設為1,這樣所有房屋就都能得到供暖。
我的思路:
首先是將house和heaters進行排序,因為到最後你會發現不排序會出錯,然後我們需要進行的是從左往右遍歷每個房間,每個點中找到最小的加熱距離,然後找到最大的距離,返回最大的距離。
class Solution { public int findRadius(int[] houses, int[] heaters) { int min = 0; Arrays.sort(heaters); Arrays.sort(houses); // int houselength = houses.length; int heaterslength = heaters.length; int j = 0; for (int i = 0; i < houses.length; i++) { while (j < heaterslength - 1 &&( Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j+1]))) { j++; } min = Math.max(min, Math.abs(houses[i] - heaters[j])); } return min; } }
排名靠前的程式碼,這裡使用的不是相對距離,使用的是加法
class Solution { public int findRadius(int[] houses, int[] heaters) { Arrays.sort(houses); Arrays.sort(heaters); int i = 0; int result = 0; for(int house : houses){ while (i < heaters.length - 1 && heaters[i] + heaters[i + 1] <= house * 2) i++; result = Math.max(result,Math.abs(heaters[i] - house)); } return result; } }