[每日算法 - 華為機試] LeetCode 475. 供暖器
入口
力扣
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),取決于排序所需空間。
方法二 雙指針
...

浙公網安備 33010602011771號