供暖器

题目:

在加热器的加热半径范围内的每个房屋都可以获得供暖。

现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。

说明:所有供暖器都遵循你的半径标准,加热的半径也一样。

示例 1:

输入: houses = [1,2,3], heaters = [2]
输出: 1
解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
示例 2:

输入: houses = [1,2,3,4], heaters = [1,4]
输出: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
示例 3:

输入:houses = [1,5], heaters = [2]
输出:3

问题转化:

一个房屋需要的供暖器的最小加热半径 = 离该房屋最近的供暖器

max{每个房屋需要的供暖器的最小加热半径}=可以覆盖所有房屋的最小加热半径。

如何计算离该房屋最近的供暖器?

解题思路:

思路一:暴力求解

每个房屋都去遍历供暖器,计算自己与供暖器的距离,保存最小值存起来。

在所有的房屋的距离中找最小值。

复杂度很高,O(m*n)

思路二:不要遍历查找,要二分查找

m*log(n)+nlog(n)[数组排序]

复杂度O((m+n)*log(n))

二分查找:先排序,再二分查找,找到最小的距离,然后记录下来。

思路三:二分查找的边界值很难确定,因此可以使用双指针,思路清晰。

对于每个房屋:

  • 当前房间有供暖器,这是我们就选当前位置为0

  • 右边最近:heaters[i] - house

  • 左边最近:house - heaters[i]

  • 特殊情况:房子左边没有暖气,(即房子位于最左边);右边没暖气。

将房子和暖气都进行排序。

对于每个房子:i指针用于遍历房子

找最小距离,就是指针 j 在暖气上移动,移到大于房子的暖气(在房子右边)则停下,这是离房子最近的右边的暖气

指针j -1:就是左边的离房子最近的暖气。

对于房子i:d = min (house[i]-heaters[j],house[i]-heaters[j-1])

var findRadius = function(houses, heaters) {// 将房子和暖气都进行排序。houses.sort((a, b) => a - b);heaters.sort((a, b) => a - b);let ans = 0;for (let i = 0, j = 0; i < houses.length; i++) {while (j < heaters.length && heaters[j] < houses[i]){j++;}let curDistance = Math.abs(houses[i] - heaters[j]);if(j === 0){curDistance = heaters[0]-houses[i] ;}else if(j === heaters.length){curDistance = houses[i]-heaters[heaters.length-1];}else {curDistance = Math.min(Math.abs(houses[i] - heaters[j-1]), Math.abs(houses[i] - heaters[j]));}ans = Math.max(ans, curDistance);}return ans;
};

细节优化处理:提交了两次,一次打败80%,一次打败94%。

优化的点在于 将length 赋给一个变量,这样就只需要计算一次数组的长度。

/*** @param {number[]} houses* @param {number[]} heaters* @return {number}*/
var findRadius = function(houses, heaters) {// 将房子和暖气都进行排序。houses.sort((a, b) => a - b);heaters.sort((a, b) => a - b);let ans = 0;for (let i = 0, j = 0; i < houses.length; i++) {while (j < heaters.length && heaters[j] < houses[i]){j++;}let curDistance = Math.abs(houses[i] - heaters[j]);// let len = heaters.length;if(j === 0){curDistance = heaters[0]-houses[i] ;}else if(j === len){curDistance = houses[i]- heaters[len-1];}else {curDistance = Math.min(Math.abs(houses[i] - heaters[j-1]), curDistance);}ans = Math.max(ans, curDistance);}return ans;
};

leetCode每日一题js--01供暖器相关推荐

  1. 830. Positions of Large Groups(Leetcode每日一题-2021.01.05)

    Problem In a string s of lowercase letters, these letters form consecutive groups of the same charac ...

  2. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  3. LeetCode每日一题——1758. 生成交替二进制字符串的最少操作数

    LeetCode每日一题系列 题目:1758. 生成交替二进制字符串的最少操作数 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个仅由字符 '0' 和 '1' ...

  4. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  5. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  6. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  7. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  8. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  9. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  10. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

最新文章

  1. boost::transform_iterator用法的测试程序
  2. 【今晚7点半】:GVoice 千万在线语音传输的那些事
  3. C++ STL string与算法
  4. 在startup中遍历程序集
  5. Ioc容器beanDefinition-Spring 源码系列(1)
  6. 了解更多关于11gR2 diskmon
  7. Java学习(16-20天, 线性数据结构)
  8. 首次面试凭借Java面试通关宝典,成功逆袭拿下美团offer
  9. 怎样解决CMD命令行窗口中文乱码问题
  10. Pycharm通过ssh远程连接服务器
  11. 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
  12. 20000本当当豆瓣畅销书电子书免费领取,免费送
  13. python中tab键_python中tab键指的是什么意思
  14. Nginx网页优化(版本、缓存时间、日志分隔、连接超时)
  15. 基于python的论文摘要怎么写_Django显示文章摘要需要如何写
  16. html表格线条不显示,cline处理表格不显示线条
  17. AI人工智能机器人教室方案(含全套配置)
  18. android 图片热点区域,Android开发之扫描附近wifi热点并列表显示
  19. Python Diary - Day 15 模块、异常和文件
  20. 5G支持下,人工智能除了AI换脸,还能干什么?

热门文章

  1. 网站子域名扫描的几种方法
  2. 书写数字识别(C++ 、 KNN 、openCV)
  3. 火车浏览器怎么样,是什么样特性
  4. 以前写的一首现代诗,无题
  5. 当当api 详情接口
  6. 苹果微信点开才会收到信息_苹果手机这些无用的功能关掉,续航大增
  7. 国内能用 公共DNS 服务器地址
  8. word中使用通配符批量将参考文献设置为上角标
  9. 王者转号仅显示可转移的服务器,王者荣耀转移号是什么意思 转移号详解[多图]...
  10. java根据模板动态生成word文档带表格