uacs2024

导航

leetcode 475. 供暖器

475. 供暖器

没做出来🤡

法一:排序 + 二分查找

class Solution {
public:
//lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
//在从小到大的排序数组中,lower_bound(begin,end,num):
//从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址(iter),不存在则返回end。
//通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
//upper_bound(begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址(iter),不存在则返回end。
//通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

//对于每个房屋 house,需要在有序数组 heaters 中找到最大的下标 i,使得 heaters[i]≤house,
//特别地,当 heaters[0]>house 时,i=−1。在得到下标 i 之后,令 j = i + 1,则 j 是满足 heaters[j]>house 的最小下标。
//特别地,当 heaters[n−1]≤house 时,j=n,其中 n 是数组 heaters 的长度。

    int findRadius(vector<int>& houses, vector<int>& heaters) {
        ranges::sort(houses);ranges::sort(heaters);
        int sizeHeat = heaters.size(),rad = 0;
        for(int &house : houses){
            int j = upper_bound(heaters.begin(),heaters.end(),house) - heaters.begin();//找第一个严格大于house的数字,即在数组heaters中找第一个位置坐标heaters[j]严格大于house的数字j
            int i = j - 1;
            int rightDistance = j >= sizeHeat ? INT_MAX : heaters[j] - house;
            int leftDistance = i < 0 ? INT_MAX : house - heaters[i];
            int curDistance = min(leftDistance,rightDistance);  //对于每个不同的house,只需要半径大于等于和左右两个供热器距离最小的那个就可以满足需求
            rad = max(rad,curDistance);
        }
        return rad;
    }
};

法二:排序 + 双指针。一开始就是这种想法,但是没有想到循环    直到 j=n−1 或者 heaters[j] 和当前房屋的距离 小于 heaters[j+1] 和当前房屋的距离

class Solution {
public:
//对于每个0 ≤ i < m,需要找到下标 j 使得 abs(houses[i]−heaters[j])最小,则 heaters[j] 是和 houses[i] 距离最近的供暖器。初始时,i=j=0。
//从左到右依次遍历数组 houses,对于每个下标 i,需要维护离 houses[i] 最近的供暖器的距离,将距离初始化为 houses[i]−heaters[j]
//只要 heaters[j] 和当前房屋的距离大于等于 heaters[j+1] 和当前房屋的距离,则将 j 加 1,
//直到 j=n−1 或者 heaters[j] 和当前房屋的距离 小于 heaters[j+1] 和当前房屋的距离,
//此时 heaters[j] 为离 houses[i] 最近的供暖器,heaters[j] 和当前房屋的距离即为当前房屋和最近的供暖器的距离。
    int findRadius(vector<int>& houses, vector<int>& heaters) {
        ranges::sort(houses);ranges::sort(heaters);
        int sizeHouse = houses.size(),sizeHeat = heaters.size(),rad = 0;
        for(int i = 0,j = 0;i < sizeHouse;++i){
            int curDistance = abs(houses[i] - heaters[j]);
            while(j < sizeHeat - 1 && abs(houses[i] - heaters[j]) >= abs(houses[i] - heaters[j+1])){
                ++j;
                curDistance = min(curDistance,abs(houses[i] - heaters[j]));
            }
            rad = max(rad,curDistance);
        }
        return rad;
    }
};

 

posted on 2024-12-28 15:10  ᶜʸᵃⁿ  阅读(18)  评论(0)    收藏  举报