LeetCode 475 供暖器[二分 排序] HERODING的LeetCode之路

在这里插入图片描述
解题思路:
本题实质上是求解每个房屋到达最近供暖器的最远距离,也就是在所有最近距离中找最大的,首先对供暖期位置排序,接着遍历每个房屋,用二分法寻找每个房屋左右的供暖器(可能没有,需要讨论),然后更新最大距离,代码如下:

class Solution {
public:
    int findRadius(vector<int>& houses, vector<int>& heaters) {
        sort(heaters.begin(), heaters.end());
        int max_r = 0;
        for(auto& house : houses) {
            // 右、左供暖器
            int right = upper_bound(heaters.begin(), heaters.end(), house) - heaters.begin();
            int left = right - 1;
            // 右边距离,没有就INT_MAX
            int rightDistance = right >= heaters.size() ? INT_MAX : heaters[right] - house;
            // 左边距离,没有就INT_MAX
            int leftDistance = left < 0 ? INT_MAX : house - heaters[left];
            int curDistance = min(leftDistance, rightDistance);
            max_r = max(max_r, min(leftDistance, rightDistance));
        }
        return max_r;
    }
};

时间复杂度:O((n + m)logn)
空间复杂度:O(logn)

PS:m为houses长度,n为heaters的长度,时间复杂度是排序时间nlogn和遍历二分时间mlogn之和,空间复杂度主要在排序部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HERODING77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值