码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 475.供暖气

时间:2019-01-17 01:19:34      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:radius   []   res   注意   lse   超过   操作   因此   return   

供暖气

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

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

所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。

说明:

  1. 给出的房屋和供暖器的数目是非负数且不会超过 25000。
  2. 给出的房屋和供暖器的位置均是非负数且不会超过10^9。
  3. 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。
  4. 所有供暖器都遵循你的半径标准,加热的半径也一样。

示例 1:

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

输出: 1

解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。

示例 2:

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

输出: 1

解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。

 

 

首先第一步,i指向houses数组,j指向heaters数组。

在第一次的while过程中,所有比heater[j]小或等于的houses[i],显然都在heater[j]的左边,那么做差后可以得到距离,这个距离指的是——对每个houses[i]而言,距离右边最近的heaters的距离。

注意!一旦houses【i】 >= heaters[j],就说明已经加热器已经不再房子的右边了。因为,需要找到下一个加热器,因此j++。然后重复上一波操作即可。

在第二次的while中,几乎和上面一样的思路,但是是从后向前遍历。相当于又保存了距离——对于每个房子而言,距离左边最近的加热器的距离。

将左右的距离中选取一个最小的,就是针对每个房子而言最近的加热器距离。

因为加热器的具体在本题中是一致的,因为我们只要找到最大距离即可。

 

 1 import java.util.Arrays;
 2 
 3 class Solution {
 4     public int findRadius(int[] houses, int[] heaters) {
 5         Arrays.sort(houses);
 6         Arrays.sort(heaters);
 7         int i=0;
 8         int j=0;
 9         int[] right=new int[houses.length];
10         Arrays.fill(right,Integer.MAX_VALUE);
11         while(i<houses.length&&j<heaters.length){
12             if(houses[i]<=heaters[j]){
13                 right[i]=heaters[j]-houses[i];
14                 i++;
15             }else{
16                 j++;
17             }
18         }
19         i=houses.length-1;
20         j=heaters.length-1;
21         int[] left=new int[houses.length];
22         Arrays.fill(left,Integer.MAX_VALUE);
23         while(i>=0&&j>=0){
24             if(houses[i]>=heaters[j]){
25                 left[i]=houses[i]-heaters[j];
26                 i--;
27             }else{
28                 j--;
29             }
30         }
31         int[] res=new int[houses.length];
32         for(i=0;i<houses.length;i++){
33             res[i]=Math.min(right[i],left[i]);
34         }
35         int max=Integer.MIN_VALUE;
36         for(i=0;i<res.length;i++){
37             if(max<res[i]) max=res[i];
38         }
39         return max;
40     }
41 }

 

Leetcode 475.供暖气

标签:radius   []   res   注意   lse   超过   操作   因此   return   

原文地址:https://www.cnblogs.com/kexinxin/p/10280241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!