• 题目描述:

  • 冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
    在加热器的加热半径范围内的每个房屋都可以获得供暖。
    现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
    说明:所有供暖器都遵循你的半径标准,加热的半径也一样。

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

  • 解析,这个题目的考点是二分查找的运用,但是难点是如何正确的二分查找和正确的运用。我们这么来理解这个题目,题目要求是给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。首先,我们要保证所有的房屋都能够被供暖器覆盖,因此我们要对房屋进行遍历,同时一个房屋可能左右各有一个供暖器(这也是大部分情况,只有左(右)供暖器的需要单独考虑),那么每个房屋必然存在两个属性,即离最近左边供暖器的距离和最近右边供暖器的距离,我们理所当然的取最小的距离作为该房子的最小供暖距离,但是由于需要保证所有房子均被供暖器覆盖,所以在所有房子中,我们需要最最大距离作为最后的结果,那么到这里,二分查找的应用就出来了,用于查找房子i在heaters中的插入位置,得到离他最近的两个供暖器。代码如下:

class Solution:def findRadius(self, houses: List[int], heaters: List[int]) -> int:"""给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径>>>self.findRadius([1,2,3,4], [1,4])>>>1"""heaters.sort()temp = 10**9+1 #1 <= houses[i], heaters[i] <= 10**9radius = 0for h in houses:hIndex = bisect.bisect_right(heaters, h)radius_left = h - heaters[hIndex-1] if hIndex>0 else tempradius_right = heaters[hIndex] - h if hIndex<len(heaters) else tempradius_c = min(radius_left, radius_right)radius = max(radius, radius_c)return radius
  • 时间复杂度:O((n+m) log n),其中 m 是数组houses 的长度,n 是数组heaters的长度。对数组heaters 排序需要 O(n log n) 的时间。使用二分查找对每个房屋寻找距离最近的供暖器,每次二分查找需要 O(log n) 的时间,有 m 个房屋,因此需要 O(m log n) 的时间。总时间复杂度是 O((n+m) log n)。
  • 空间复杂度:O(log n),其中 n 是数组heaters的长度。空间复杂度主要取决于排序所需要的空间。

leetcode刷题日记-供暖器相关推荐

  1. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  2. Leetcode刷题日记(十二)

    又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...

  3. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

  4. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  5. leetcode刷题日记(一)—— 数组

    因为暑期实习找得很不顺利,感觉自身最大的问题体现在刷题量偏少,操作系统,数据库基础不好,所以现在决定写博客来记录整个过程,希望能找到大厂offer,如果不能找到的话也算是为秋招做准备. 剑指offer ...

  6. 石器时代 —— Leetcode刷题日记 (一 百大热题)

    Date: 2019.10.22 - (C++ Version) 文章目录 All Labels: `热题100` L1 两数之和 L2 两数相加 暴力相加 递归 迭代 L3 无重复字符的最长子串 L ...

  7. [东哥的leetcode刷题日记] leetcode 278 :First Bad Version

    leetcode 278 :First Bad Version 题目链接: https://leetcode-cn.com/problems/search-insert-position/ 难度: 简 ...

  8. LeetCode刷题日记盛最多水的容器

    节后第一天,鉴于五一五天都没做过题,有点遗忘了,今天来看一道简单点的题,练下手. 先看下题: 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条 ...

  9. [东哥的leetcode刷题日记] leetcode 283 : Move Zeroes

    leetcode 283 : Move Zeroes 题目链接: https://leetcode-cn.com/problems/move-zeroes/ 难度: 简单 归类 : 数组操作 题目: ...

  10. LeetCode刷题日记精选例题(解析+代码+链接)

    文章目录 一.用栈模拟队列 二.用队列模拟栈 三.有效的括号 解法一 解法二 四.删除字符串中所有相邻重复项 五.逆波兰表达式求值 六.滑动窗口最大值 七.前k个高频元素 一.用栈模拟队列 因为队列先 ...

最新文章

  1. 每日一皮:据说PM就是这样忍受你的!
  2. python笔记:正则表达式
  3. 【深度学习】深入理解LSTM
  4. php文件名函数,php 获取文件名basename()函数的用法总结
  5. 发布一个自己开发的网站
  6. for循环的使用步骤 1104
  7. 页描述符 linux,有关Crontab导致Linux文件描述符...-探讨:crond 引发大量sendmail进...-linux下的ulimit命令用法解析(图文)_169IT.COM...
  8. python+request+Excel做接口自动化测试
  9. Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
  10. 中国移动 招聘 php,中国移动开启社招,这真的是机会?移动员工:携网转号累死你...
  11. android shn1 获取_华为光猫获得Root Shell(shell的root权限)详细说明,接力sdgaojian发帖。...
  12. java求两点间的距离_java计算两点间的距离方法总结
  13. html tbody边框,tbody边框呈现问题
  14. 将Excel数据导入Matlab+Matlab二次曲线拟合
  15. 大促中为什么需要可视化监控大屏?
  16. android图片音乐播放器,android 音乐播放器----获取专辑封面图片
  17. 太阳能路灯实际功率怎么计算?
  18. 核电站仪控系统智能测试平台设计
  19. 一篇文章学会springMVC
  20. 思科学院cisco独家整理题库(2022.11.7更新)

热门文章

  1. html页面背景位置,html5background位置
  2. 象棋软件最强手机版_我说它是地表手机最强清理软件,没意见吧
  3. android java笔试题_Android之Java基础知识笔试题
  4. 电子计算机第一代到第四代,从第一代电子计算机到第四代计算机的体系结构都是由运算器、控制器、存储器、输入设备和输出设备组成的,称为( )体系结构。...
  5. Linux:进入文件夹提示Permission denied错误
  6. Git/Gitlab项目开发使用简介
  7. yolov3聚类自己数据的anchor box
  8. WebAPI Delete方法报错405 Method Not Allowed
  9. CSS深入理解之border
  10. mybatis配置sql超时时间