Leetcode: Heaters

Winter is coming! Your first job during the contest is to design a standard heater with fixed warm radius to warm all the houses.

Now, you are given positions of houses and heaters on a horizontal line, find out minimum radius of heaters so that all houses could be covered by those heaters.

So, your input will be the positions of houses and heaters seperately, and your expected output will be the minimum radius standard of heaters.

Note:
Numbers of houses and heaters you are given are non-negative and will not exceed 25000.
Positions of houses and heaters you are given are non-negative and will not exceed 10^9.
As long as a house is in the heaters‘ warm radius range, it can be warmed.
All the heaters follow your radius standard and the warm radius will the same.
Example 1:
Input: [1,2,3],[2]
Output: 1
Explanation: The only heater was placed in the position 2, and if we use the radius 1 standard, then all the houses can be warmed.
Example 2:
Input: [1,2,3,4],[1,4]
Output: 1
Explanation: The two heater was placed in the position 1 and 4. We need to use radius 1 standard, then all the houses can be warmed.

Binary Search My solution:

Be careful in my binary search function, l, r may go out of the range of the array

 1 public class Solution {
 2     public int findRadius(int[] houses, int[] heaters) {
 3         Arrays.sort(heaters);
 4         int minRange = Integer.MIN_VALUE;
 5         for (int house : houses) {
 6             int range = binarySearch(house, heaters);
 7             minRange = Math.max(minRange, range);
 8         }
 9         return minRange;
10     }
11
12     public int binarySearch(int house, int[] heaters) {
13         int l=0, r=heaters.length-1;
14         while (l <= r) {
15             int m = (r-l)/2 + l;
16             if (heaters[m] == house) return 0;
17             else if (heaters[m] < house) l = m + 1;
18             else r = m - 1;
19         }
20         if (l >= heaters.length) return Math.abs(heaters[r]-house);
21         else if (r < 0) return Math.abs(heaters[l]-house);
22         return Math.abs(heaters[r]-house)<Math.abs(heaters[l]-house)? Math.abs(heaters[r]-house) : Math.abs(heaters[l]-house);
23     }
24 }

Solution with the highest vote:

 1 public class Solution {
 2     public int findRadius(int[] houses, int[] heaters) {
 3         Arrays.sort(heaters);
 4         int result = Integer.MIN_VALUE;
 5
 6         for (int house : houses) {
 7             int index = Arrays.binarySearch(heaters, house);
 8             if (index < 0) {
 9                 index = -(index + 1);
10             }
11             int dist1 = index - 1 >= 0 ? house - heaters[index - 1] : Integer.MAX_VALUE;
12             int dist2 = index < heaters.length ? heaters[index] - house : Integer.MAX_VALUE;
13
14             result = Math.max(result, Math.min(dist1, dist2));
15         }
16
17         return result;
18     }
19 }
时间: 2024-10-13 23:20:21

Leetcode: Heaters的相关文章

leetcode 475. 供暖器(Heaters)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径. 所以,你的输入将会是房屋和供暖器的位置.你将输出供暖器的最小加热半径. 说明: 给出的房屋和供暖器的数目是非负数且不会超过 25000. 给出的房屋和供暖器的位置均是非负数且不会超过109. 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖. 所有供暖器都遵循你的半

LeetCode #475 Heaters

Question Winter is coming! Your first job during the contest is to design a standard heater with fixed warm radius to warm all the houses. Now, you are given positions of houses and heaters on a horizontal line, find out minimum radius of heaters so

475. Heaters

http://www.cnblogs.com/EdwardLiu/p/6197086.html https://leetcode.com/problems/heaters/#/description public int findRadius(int[] houses, int[] heaters) { if (houses == null || houses.length == 0) { return 0; } Arrays.sort(houses); Arrays.sort(heaters)

LeetCode Binary Search Summary 二分搜索法小结

二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在LeetCode中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目标有很多种,而且在细节写法也有一些变化.之前有网友留言希望博主能针对二分查找法的具体写法做个总结,博主由于之前一直很忙,一直拖着没写,为了树立博主言出必行的正面形象,不能再无限制的拖下去了,那么今天就来做个了断吧,总结写起来~ (以下内容均为博主自己的总结,并不权威,权当参考,欢迎各位大神们留言讨论

[LeetCode] 349 Intersection of Two Arrays &amp; 350 Intersection of Two Arrays II

这两道题都是求两个数组之间的重复元素,因此把它们放在一起. 原题地址: 349 Intersection of Two Arrays :https://leetcode.com/problems/intersection-of-two-arrays/description/ 350 Intersection of Two Arrays II:https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ 题目&解法

LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar