1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 int findRadius(vector<int>& houses, vector<int>& heaters) 12 { 13 sort(heaters.begin(),heaters.end()); 14 int minRadius=0; 15 int szHouses=houses.size(); 16 for(int i=0;i<szHouses;i++) 17 { 18 int curRadius=INT_MAX; 19 auto larger=lower_bound(heaters.begin(),heaters.end(),houses[i]); 20 if(larger!=heaters.end()) 21 curRadius=*larger-houses[i]; 22 if(larger!=heaters.begin()) 23 { 24 auto smaller=larger-1; 25 curRadius=min(curRadius,houses[i]-*smaller); 26 } 27 minRadius=max(minRadius,curRadius); 28 } 29 return minRadius; 30 } 31 };
找最小热源半径,扫描房屋数组,找到所有房屋被最近热源覆盖所需要的热源半径,取这些所有半径的最大值即可。
值得注意的是两头的情况和中间额情况不同,一个房屋两侧都有热源时,要取两边覆盖半径的较小值。