当前位置: 首页 > news >正文

Leetcode——475. 供暖器

该题思路最重要的一点是从房子角度出发,寻找每一个最优的供暖器,取所有房子最优结果的最大值。如果从供暖器角度出发,则很难思考。

之后用两个变量分别指向房子数组和供暖器数组即可,整体依旧是双指针的经典思路。

class Solution {
public:int findRadius(vector<int>& houses, vector<int>& heaters) {sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int l = 0, r = 0;   // l -> houses    r -> heatersint ans = 0;while(l < houses.size()){int house = houses[l];while(r + 1 < heaters.size() && abs(heaters[r + 1] - house) <= abs(heaters[r] - house)){r++;}ans = max(ans, abs(heaters[r] - house));l++;}return ans;}
};

另一种二分解法,其实是基于暴力枚举的改进。

对于数据量来说,我们可以枚举所有半径可能性,取最优解。而最优解天然带有二分属性,即如果当前半径可以使供暖器覆盖所有房屋,则最优解一定在区间左半,否则最优解在右半。根据该思路,我们可以写出如下基本框架。

int findRadius(vector<int>& houses, vector<int>& heaters) {sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int l = 0, r = (int)1e9;while(l < r){int mid = l + ((r - l) >> 1);if(check(houses, heaters, mid)){r = mid;}else{l = mid + 1;}}return r;}

之后的重点只需要放在check函数的实现上即可。

// 判断半径为radius时能否覆盖所有房屋bool check(vector<int>& houses, vector<int>& heaters, int radius){int n = houses.size(), m = heaters.size();// i -> houses  j -> heatersfor(int i = 0, j = 0; i < n; ++i){while(j < m && heaters[j] + radius < houses[i]) { j++; }    // 最小供暖器没覆盖if(j < m && heaters[j] - radius <= houses[i] && heaters[j] + radius >= houses[i]){continue;       // j号供暖器可覆盖i号房屋, 继续检测i + 1号房屋}else{return false;   // radius半径下存在 i 号房屋无法被覆盖}}return true;}

check函数实质上依旧使用的是双指针,其更像是从供暖器角度出发,设立区间,遍历房屋,观察房屋是否在该区间上,进而判断当前半径是否有覆盖。

这种区间移动的思想起初自己并没有想到,而且只考虑到要枚举所有半径,的确没想到用二分来快速查找结果。

http://www.dtcms.com/a/304752.html

相关文章:

  • Python - property
  • 学习笔记-中华心法问答系统的性能提升
  • pnpm 入门与实践指南
  • 字节序详解
  • webpack 原理及使用
  • 纸板制造胶工艺学习1
  • FlinkCDC实现多数据源数据集的增量更新实战
  • 磁悬浮转子同频振动:自适应陷波器设计与稳定性深度解析(附MATLAB代码)
  • 8.项目起步(2)
  • 本土化DevOps实践新篇章:Gitee引领企业高效协作新时代
  • 自学嵌入式 day37 HTML
  • Go 客户端玩转 ES|QL API 直连与 Mapping Helpers 实战详解
  • 做副业,要事不过三
  • CentOS 7部署Redis
  • 如何理解js中的副作用
  • 沪铝本周想法
  • docker docker与swarm入门笔记
  • 云原生周刊:2025年的服务网格
  • 【Linux基础知识系列】第七十篇 - 了解swap分区的概念
  • 【Linux篇】补充:消息队列和systemV信号量
  • 【图像噪点消除】——图像预处理(OpenCV)
  • 以太坊十年:智能合约与去中心化的崛起
  • 第5课 sort函数
  • Couchbase 详解
  • HBase 详解
  • 使用jQuery时的注意事项
  • Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
  • 每日学习笔记记录(分享更新版-凌乱)
  • 亚马逊欧洲站流量破局:多维策略重构与运营效能升级
  • 社区版 2025.7 | CQ-Mate V1.3发布啦!