1. 程式人生 > 其它 >【力扣 080】475. 供暖器

【力扣 080】475. 供暖器

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

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/heaters
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

方法一:二分法

程式碼實現:

class Solution {
public:
    int findRadius(vector<int>& houses, vector<int>& heaters) 
    {
        sort(houses.begin(), houses.end());
        sort(heaters.begin(), heaters.end());
        int l = 0, r = 1e9, mid;
        while(l < r)
        {
            mid = l + (r-l)/2;
            if(check(houses, heaters, mid)) r = mid;
            else l = mid + 1;
        }
        return l;
    }

    bool check(vector<int> &houses, vector<int> &heaters, int x)
    {
        int n = houses.size(), m = heaters.size();
        for(int i = 0, j = 0; i < n; ++i)
        {
            while(j < m && houses[i] > heaters[j] + x)  ++j;
            if(j < m && heaters[j] - x <= houses[i] && houses[i] <= heaters[j] +x ) continue;
            return  false;
        }
        return true;
    }
};