解题思路
依题意,给了两个数组,分别是房子和供暖器。
要求的是供暖器的最小半径,使得每个房子都可以得到供暖。
按常规思维,可知:
房子总是找最近的供暖器请求供暖,这时候求出半径r1
所有的房子都会求出一个半径,在这个半径数组里面的最大值,就是题解。
那么问题转化成:如何快速的找到离房子最近的供暖器。
供暖器是个数组,也就是这个房子在供暖器这个数组中,左边所需半径和右边所需半径的最小值,就是要求的r1
如何快速查找呢?我们首先想到的是二分查找,转化为代码就是先求第一个比house大的值的位置,然后j-1就是最后一个比house小的值的位置。
然后求这两个半径的最小值得到的r1,以此类推得到所有house的最小半径r[],其中取最大值就是题解。
代码中对供暖器排序是为了方便用二分查找,如果是用双指针的话,也要对房子位置进行排序才行。
代码如下;
代码
class Solution {
public:
int findRadius(vector<int>& houses, vector<int>& heaters)
{
int ans = 0;
// 供暖器排序
sort(heaters.begin(),heaters.end());
for(auto house : houses)
{
// 二分查找,查找house在heaters中最接近的右边
int j = upper_bound(heaters.begin(), heaters.end(), house) - heaters.begin();
// 此处为左边(小于house的供暖器)
int i = j - 1;
int rightDistance,leftDistance;
if( j >= heaters.size())
{
// 说明所有供暖器的位置都在他左边,所以这个值一定不会取,设置为INT最大值
rightDistance = INT_MAX;
}
else
{
rightDistance = heaters[j] - house;
}
if(i < 0)
{
// 同理,异常处理
leftDistance = INT_MAX;
}
else
{
leftDistance = house - heaters[i];
}
// 求最接近房子的供暖器以及其最小半径
int curDistance = min(leftDistance, rightDistance);
// 所有最小半径中的最大值就是答案
ans = max(ans, curDistance);
}
return ans;
}
};