暴力
遍历每一个house位置,找到离最近的heater的距离,最终取距离最大。
class Solution {
public int findRadius(int[] houses, int[] heaters) {
int ans=-1;
for(int house:houses){
ans=Math.max(ans,findMinDest(house,heaters));
}
return ans;
}
private int findMinDest(int house,int[] heaters){
int des=Integer.MAX_VALUE;
for(int heater:heaters){
des=Math.min(des,Math.abs(house-heater));
}
return des;
}
}
二分
既然暴力查找了,岂能不用二分?
二分前提是有序,所以我们先排序。
class Solution {
public int findRadius(int[] houses, int[] heaters) {
Arrays.sort(heaters);
int ans=-1;
for(int house:houses){
ans=Math.max(ans,findMinDest(house,heaters));
}
return ans;
}
private int findMinDest(int house,int[] heaters){
int len=heaters.length-1;
if(house>=heaters[len]) return (house-heaters[len]);
if(house<=heaters[0]) return (heaters[0]-house);
int des=Integer.MAX_VALUE;
int left=0;
int right=heaters.length-1;
while(left<=right){
int mid=left+((right-left)>>1);//这个地方当时括号错了,调了半天。
if(heaters[mid]==house) return 0;
if(heaters[mid]<house){
//如果当前house>heater[mid],那我们向右缩小范围
des=Math.min(des,Math.abs(house-heaters[mid]));
left=mid+1;
}else{
//当前house<heater[mid],那我们向左缩小范围
des=Math.min(des,Math.abs(house-heaters[mid]));
right=mid-1;
}
}
return des;
}
}