【力扣 080】475. 供暖器
阿新 • • 發佈:2022-05-28
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; } };