LeetCode算法题-Heaters(Java实现)
这是悦乐书的第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<houses.length; 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算法题-Heaters(Java实现)的更多相关文章
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
随机推荐
- Zara精讲C#.Cache、它和Redis区别是什么???
前言:今天在博客园看到大佬在用Cache,非常不懂,原来它是搞缓存的,原来我只知道Redis是搞这个的,才知道有这个玩腻. 那它们的区别是什么呢?? 区别: redis是分布式缓存,是将数据随机分配到 ...
- Qt之自定义托盘
说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方面也不差,在平台扩展方面也是非常的强大.这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了 ...
- RS232串口的Windows编程纪要
再次是一篇入门文,各路神仙退散. 直接进入主题,又不是历史课,关于RS232那些前世今生的故事就不摆了. 硬件链接 首先以9针小口为例(大口应当只能去博物馆看了吧)看一下管脚排布,其实RS232本身没 ...
- SpringBoot入门教程(十八)@value、@Import、@ImportResource、@PropertySource
Spring Boot提倡基于Java的配置.这两篇博文主要介绍springboot 一些常用的注解介绍 v@value 通过@Value可以将外部的值动态注入到Bean中. 添加applicatio ...
- Java基础12:深入理解Class类和Object类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Java开发知识之Java面相对象
Java开发知识之Java面相对象上 一丶什么是面相对象 了解什么什么是面相对象.那么首先要了解什么是面相过程. 面相过程的意思就是. 什么事情都亲力亲为. 比如上一讲的排序算法. 我们自己写的. 这 ...
- PE知识复习之PE扩大节
PE知识复习之PE扩大节 一丶为什么扩大节 上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节. 扩大节其实很简单.修改节数据对齐后的大小即可. 并且在PE ...
- Jenkins结合.net平台综合之完整示例项目
前面每一个部分我们都是介绍的单个功能,这里介绍一个完整项目,本文中所用到的命令都放在了github示例代码仓库中 https://github.com/mrtylerzhou/netdevops 命令 ...
- Linux find常用用法示例
在此处只给出find的基本用法示例,都是平时我个人非常常用的搜索功能.如果有不理解的部分,则看后面的find运行机制详解对于理论的说明,也建议在看完这些基本示例后阅读一遍理论说明,它是本人翻译自fin ...
- 第55章 API资源 - Identity Server 4 中文文档(v1.0.0)
此类建模API资源. Enabled 指示此资源是否已启用且可以请求.默认为true. Name API的唯一名称.此值用于内省身份验证,并将添加到传出访问令牌的受众. DisplayName 该值可 ...