入口
力扣https://leetcode.cn/problems/heaters/submissions/
题目描述
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 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
方法一:排序、二分查找
解题思路
对一每一个房间,要么利用左边的取暖器,要么利用右边的取暖器,利用二分查找的方式查询出距离房间最近的左右两边的取暖器,取两者的最小值即当前房间取暖所需取暖器最小半径,最后取所有的房间所需最小半径的最大值即可!
特殊情况:
- 房间左边没有取暖器
- 房间右边没有取暖器
- 取暖器在所有房间的另一侧
Java示例
class Solution {
public int findRadius(int[] houses, int[] heaters) {
int distance = 0;
Arrays.sort(heaters);
for(int house: houses){
int left = binarySearch(heaters,house);
int right = left +1 ;//考虑left = length-1的情况
//如果左边没有取暖器,那么比较的时候取左边取暖器的距离的值!
int leftDestance = left<0?Integer.MAX_VALUE : house - heaters[left];
//如果右边没有取暖器,那么比较的时候取左边取暖器的距离的值
int rightDestance =right>=heaters.length?Integer.MAX_VALUE : heaters[right] - house;
int min = Math.min(leftDestance,rightDestance);
distance = Math.max(distance,min);
}
return distance ;
}
//查找距离target hourse最近的供暖器
public int binarySearch(int[] nums,int target){
int left = 0,right = nums.length-1;
//第一个取暖器就在房间右边
if(nums[left]>target){
return -1;
}
while(left < right){
int mid = (right - left + 1)/2 +left;
if(nums[mid] > target){
right--;
}else{
left = mid;
}
}
return left;
}
}
时间复杂度:O((m+n)logn), 数组排序nlogn,二分查找mlogn。
空间复杂度:O(logn),取决于排序所需空间。
方法二 双指针
...