这是悦乐书的第239次更新,第252篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475)。冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径的标准加热器,以加热所有房屋。现在,您可以在水平线上获得房屋和加热器的位置,找出加热器的最小半径,以便所有房屋都能被这些加热器覆盖。因此,您的输入将分别是房屋和加热器的位置,您的预期输出将是加热器的最小半径。例如:

输入:[1,2,3],[2]

输出:1

说明:唯一的加热器在位置2,如果我们使用半径1标准,那么所有房屋都可以加热。

输入:[1,2,3,4],[1,4]

输出:1

说明:两个加热器在位置1和4,我们需要使用半径1标准,然后所有房屋都可以加热。

注意:

您给出的房屋和加热器的数量是非负数,不会超过25000。

您给出的房屋和加热器的位置是非负的,不会超过10 ^ 9。

只要房子在加热器的温暖半径范围内,就可以加热。

所有加热器都遵循半径标准,温暖半径也是如此。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

我们将房子、加热器都先排序,然后利用两层循环,外层遍历房子,内层遍历加热器,每次获取到房子,就去比较对应位置的左右加热器,拿他们的位置值与当前房子的位置值之间的绝对值做比较,如果右边的加热器的位置值绝对值小于左边的,就继续向右比较,也就是取当前房子在左右加热器之间的最小半径。然后将当前的最小半径和上一次比较获得的最小半径取最大值,因为要覆盖所有的房子。

public int findRadius(int[] houses, int[] heaters) {

if (houses == null || heaters == null) {

return 0;

}

int result = Integer.MIN_VALUE;

Arrays.sort(houses);

Arrays.sort(heaters);

int i = 0, j = 0;

while (i < houses.length) {

while (j < heaters.length-1 && Math.abs(heaters[j+1] - houses[i]) <=

Math.abs(heaters[j] - houses[i])) {

j++;

}

result = Math.max(result, Math.abs(heaters[j] - houses[i]));

i++;

}

return result;

}

03 第二种解法

我们先将加热器排序,然后遍历houses中的元素,我们使用二分法找到当前房子在加热器中的最小半径,即当前位置的房子在对应位置的加热器中,其左右加热器到房子之间的最小值,然后比较所有房子的最小半径,在其中取最大值,即最大值所代表的的半径能够覆盖所有房子。

public int findRadius2(int[] houses, int[] heaters) {

if (houses == null || heaters == null) {

return 0;

}

Arrays.sort(heaters);

int result = Integer.MIN_VALUE;

for (int i=0; i

int rad = findOne(houses[i], heaters);

result = Math.max(result, rad);

}

return result;

}

public int findOne(int house, int[] heaters) {

int start = 0, end = heaters.length-1;

int left = Integer.MAX_VALUE, right = Integer.MAX_VALUE;

while (start <= end) {

int mid = (start+end)/2;

int heater = heaters[mid];

if (house == heater) {

return 0;

} else if (house < heater) {

right = heater - house;

end = mid - 1;

} else {

left = house - heater;

start = mid + 1;

}

}

return Math.min(left, right);

}

04 第三种解法

此解法和第二种解法的思路是一致的,也是利用二分法,只是借助Arrays类的binarySearch方法来完成。

public int findRadius3(int[] houses, int[] heaters) {

if (houses == null || heaters == null) {

return 0;

}

Arrays.sort(heaters);

int result = Integer.MIN_VALUE;

for (int house : houses) {

int index = Arrays.binarySearch(heaters, house);

if (index < 0) {

index = -(index + 1);

}

int dis = index-1 >= 0 ? house - heaters[index-1] : Integer.MAX_VALUE;

int dis2 = index < heaters.length ? heaters[index] - house : Integer.MAX_VALUE;

result = Math.max(result, Math.min(dis, dis2));

}

return result;

}

05 小结

算法专题目前已日更超过三个月,算法题文章106+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

leetcode 用java_LeetCode算法题-Heaters(Java实现)相关推荐

  1. largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  2. add binary java_LeetCode算法题-Add Binary(Java实现)

    这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...

  3. power of two java_LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  4. min java_LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  5. magic square java_LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

  6. island of java_LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  7. quadtree java_LeetCode算法题-Quad Tree Intersection(Java实现)

    这是悦乐书的第260次更新,第273篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第127题(顺位题号是558).四叉树是树数据,其中每个内部节点恰好有四个子节点:top ...

  8. quadtree java_LeetCode算法题-Construct Quad Tree(Java实现)

    这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...

  9. 算法题库 java实现_LeetCode算法题-Most Common Word(Java实现)

    这是悦乐书的第321次更新,第342篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第190题(顺位题号是819).给定一个段落和一组禁止词,返回不在禁止词列表中的最常用词 ...

最新文章

  1. 算法--------俄罗斯套娃信封问题(Java版本)
  2. 缓存-SpringCache-整合体验@Cacheable
  3. AS3.0中的显示编程(末篇)-- 滤镜(下)
  4. 静态页面被拦截解决办法
  5. 采用curl库在PHP程序之间传递数组
  6. (微信小程序)二 : 创建一个页面
  7. 绿坝老板不诚实,蒙骗政府官员
  8. 网吧服务器常用设置维护工具,某某网吧专用维护工具
  9. Numpy tricks
  10. Uncaught SyntaxError The requested module ‘node_modules.vitevue.jsv=50ccac76‘ does not provide
  11. python爬取app中的音频_Python爬取喜马拉雅音频数据详解
  12. 那个被“爱”刺伤的30岁女孩,在这款游戏里完成了自我“救赎”
  13. Discuz 服务器重启后无法访问
  14. 人间清醒,内容为王 - 技术er究竟该如何写博客?1024上海嘉年华之敖丙演讲观后感。
  15. 用HTML写的HTML笔记大全✌
  16. 怎样破解BIOS密码
  17. 《我的学习经历》——杨振宁
  18. 顺序表正负数的调整 (10分)
  19. 把桌面从C盘改到D盘,结果直接让D盘变成了桌面,改回去发现图标变少了
  20. 微信小程序的条件判断wx:if、wx:elif以及for循环wx:for

热门文章

  1. html5 兼容移动端参数设置的一些小细节
  2. python中的reduce、lambda函数
  3. VisualSVN5.1.7补丁原创发布
  4. plsql developer 10注册码----亲测截止2017年5月6可用
  5. android java file 清理垃圾获取文件大小 删除文件等操作
  6. 浅析Objective-C字面量
  7. (Oracle)PL SQL的相关知识与实例
  8. 博客重构 / Blog Refactoring
  9. 操作系统识别工具 xprobe2 p0f 简介
  10. python3 selenium 无头浏览器 错误 FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'