题目
思路
- 对于一个房子而言,要么是它左边最近的供暖器供暖,要么是它右边最近的供暖器供暖。
- 现在的问题就是如何在供暖器序列当中找到,特定房子的左边最近距离和右边最近距离
- 通过二分查找确定左边最近距离(找到供暖器序列当中小于等于
cur_house_pos
的右端点即可)
代码
class Solution {
public:
int findRadius(vector<int>& houses, vector<int>& heaters) {
// 对于所有的房屋而言,要么是前一个供暖器,要么是后一个供暖器供应
// 那么,检查所有的房屋,可以得到最大值,就是需要的最小加热半径
sort(houses.begin(), houses.end());
sort(heaters.begin(), heaters.end());
int num_houses = houses.size(), num_heaters = heaters.size();
long long min_radius = 0;
for (int i = 0; i < num_houses; ++i) {
int cur_house_pos = houses[i];
// 找到小于等于房屋位置的最右边的供暖器
int left = 0, right = num_heaters - 1;
while (left < right) {
int mid = (left + right + 1) / 2;
if (heaters[mid] <= cur_house_pos) {
left = mid;
} else {
right = mid - 1;
}
}
// 小于等于房屋位置的供暖器可能不存在,heaters[right]可能是大于房屋位置的最左边数字
// 因此需要加上abs
long long dis_before = abs(cur_house_pos - heaters[right]);
left = 0, right = num_heaters - 1;
while (left < right) {
int mid = (left + right) / 2;
if (heaters[mid] >= cur_house_pos) {
right = mid;
} else {
left = mid + 1;
}
}
long long dis_after = abs(heaters[left] - cur_house_pos);
min_radius = max(min_radius, min(dis_before, dis_after));
}
return min_radius;
}
};