1. 程式人生 > >111、供暖器

111、供暖器

冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。
現在,給出位於一條水平線上的房屋和供暖器的位置,找到可以覆蓋所有房屋的最小加熱半徑。
所以,你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑。
說明:

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