zoukankan      html  css  js  c++  java
  • 475. 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:

    1. Numbers of houses and heaters you are given are non-negative and will not exceed 25000.
    2. Positions of houses and heaters you are given are non-negative and will not exceed 10^9.
    3. As long as a house is in the heaters' warm radius range, it can be warmed.
    4. 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.

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    the straight-forward check whether the next heater is closer than the current. Then I thought I probably don't need abs if I just use
        while heaters[i+1] - x <= x - heaters[i]:更
    That's obviously correct if x is between the heaters, because then that's the correct distances of x to the two heaters. Less obviously (but imho not surprisingly) it's also correct if x isn't between them. Finally, after rewriting it to
        while heaters[i] + heaters[i+1] <= 2 * x

    [一句话思路]:

    头回见 不知道什么才是“覆盖全部”的最小距离:

    每个house都取最小距离求并集(最大距离)即可

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 大小顺序不确定的距离 要加绝对值,别忘了
    2. i 更新为 i +1之后变大了,此时用i。不用原来的i+ 1

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    [复杂度]:Time complexity: O(n) Space complexity: O(1)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    更新之后用i 

    for (int house : houses) {
                while (i < heaters.length - 1 && heaters[i + 1] + heaters[i] <= 2 * house) {
                    i++;
                }
                res = Math.max(res, Math.abs(heaters[i] - house));
            }

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    class Solution {
        public int findRadius(int[] houses, int[] heaters) {
            //ini: sort
            Arrays.sort(houses);
            Arrays.sort(heaters);
            int res = Integer.MIN_VALUE, i = 0;
            
            //update
            for (int house : houses) {
                while (i < heaters.length - 1 && heaters[i + 1] + heaters[i] <= 2 * house) {
                    i++;
                }
                res = Math.max(res, Math.abs(heaters[i] - house));
            }
            
            return res;
        }
    }
    View Code
  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8966569.html
Copyright © 2011-2022 走看看