475. 供暖和取暖:二分查找+双指针+贪心算法+排序

解题思路

依题意,给了两个数组,分别是房子和供暖器。
要求的是供暖器的最小半径,使得每个房子都可以得到供暖。
按常规思维,可知:
房子总是找最近的供暖器请求供暖,这时候求出半径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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值