题目

image.png

思路

  • 对于一个房子而言,要么是它左边最近的供暖器供暖,要么是它右边最近的供暖器供暖。
  • 现在的问题就是如何在供暖器序列当中找到,特定房子的左边最近距离和右边最近距离
  • 通过二分查找确定左边最近距离(找到供暖器序列当中小于等于cur_house_pos的右端点即可)

代码

  1. class Solution {
  2. public:
  3. int findRadius(vector<int>& houses, vector<int>& heaters) {
  4. // 对于所有的房屋而言,要么是前一个供暖器,要么是后一个供暖器供应
  5. // 那么,检查所有的房屋,可以得到最大值,就是需要的最小加热半径
  6. sort(houses.begin(), houses.end());
  7. sort(heaters.begin(), heaters.end());
  8. int num_houses = houses.size(), num_heaters = heaters.size();
  9. long long min_radius = 0;
  10. for (int i = 0; i < num_houses; ++i) {
  11. int cur_house_pos = houses[i];
  12. // 找到小于等于房屋位置的最右边的供暖器
  13. int left = 0, right = num_heaters - 1;
  14. while (left < right) {
  15. int mid = (left + right + 1) / 2;
  16. if (heaters[mid] <= cur_house_pos) {
  17. left = mid;
  18. } else {
  19. right = mid - 1;
  20. }
  21. }
  22. // 小于等于房屋位置的供暖器可能不存在,heaters[right]可能是大于房屋位置的最左边数字
  23. // 因此需要加上abs
  24. long long dis_before = abs(cur_house_pos - heaters[right]);
  25. left = 0, right = num_heaters - 1;
  26. while (left < right) {
  27. int mid = (left + right) / 2;
  28. if (heaters[mid] >= cur_house_pos) {
  29. right = mid;
  30. } else {
  31. left = mid + 1;
  32. }
  33. }
  34. long long dis_after = abs(heaters[left] - cur_house_pos);
  35. min_radius = max(min_radius, min(dis_before, dis_after));
  36. }
  37. return min_radius;
  38. }
  39. };