zoukankan      html  css  js  c++  java
  • Leetcode 475.供暖气

    供暖气

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

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

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

    说明:

    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 }
  • 相关阅读:
    【PHP】算法: 获取满足给定值的最优组合
    @程序员,你还记得当年高考时的样子吗?
    教妹学 Java:难以驾驭的多线程
    二十九岁,刚读完了财富启蒙读物《小狗钱钱》
    蓦然回首,Java 已经 24 岁了!
    @程序员,你需要点金融常识
    教妹学 Java:大有可为的集合
    @程序员,你需要点财商
    教妹学 Java:晦涩难懂的泛型
    大量阅读,并不等同于“走马观花”
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10280241.html
Copyright © 2011-2022 走看看