【每日一题】Day0009:力扣题库NO.475. 供暖器

又是周一了,我们来做题。

力扣-475 供暖器icon-default.png?t=LA92https://leetcode-cn.com/problems/heaters/submissions/今天的题目很有意思,确实像是现实中会碰到的问题的一个简化模型。

思路:

题目没有提到两个数组是否有序,所以习惯地先进行了排序。类似的问题基本上都是有序数组才能进行处理。

要保证每个房子都会被供暖器覆盖,那么遍历每个房子,计算该房子到距离它最近的一前一后两个供暖器之间的距离,将两个距离中较近的那个做为我们选取的取暖器(很符合现实);而如果离它最近的只有一个那便没得选。遍历结束后,我们计算得出的这些距离里,为了保证每个房子都能覆盖,取其中最大距离即可满足。

代码如下:

package cn.daycode.leetcode;

import java.util.Arrays;

public class FindRadius {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] houses = {1,1,1,1,1,1,999,999,999,999,999};
        int[] heaters = {499,500,501};
        System.out.println(s.findRadius(houses,heaters));

    }
}
class Solution {
    public int findRadius(int[] houses, int[] heaters) {
        Arrays.sort(houses); // 题目没有说这俩数组是有序的,姑且先排个序
        Arrays.sort(heaters);

        int i = 0; // 记录房子遍历的下标
        int j = 0; // 记录暖气遍历的下标
        int maxDis = 0; // 记录目前的取暖器供暖需要的最大距离

        while(i < houses.length){ // 遍历所有房屋
            // 取该房子左右两侧的供暖器(如果有)与该房屋的距离,取较小者
            if(heaters.length == 1){ // 只有一个取暖器的情况
                maxDis = Math.max(Math.abs(heaters[j]-houses[i]), maxDis);
                i++;
            }else if(j == 0) { // 特殊情况:多个取暖器的第一个取暖器
                // 第一个取暖器比但钱房屋值大则计算其距离否则看下一个取暖器
                if (heaters[j] >= houses[i]) {
                    maxDis = Math.max(heaters[j] - houses[i], maxDis);
                    i++;
                } else {
                    j++;
                }
            }else {
                // 普遍情况:房子在两个取暖器之间,取其中较短距离的取暖器供暖并计算距离
                if(heaters[j] >= houses[i] && heaters[j - 1] < houses[i]){
                    int temp = Math.min(heaters[j] - houses[i], houses[i] - heaters[j - 1]);
                    maxDis = Math.max(temp, maxDis);
                    i++;
                }else {
                    // 如果房子不在两个取暖器之间,后面还有取暖器就下一个,否则只能用最后一个取暖器了
                    if( j == heaters.length-1){
                        maxDis = Math.max(houses[i]-heaters[j], maxDis);
                        i++;
                    }else{
                        j++;
                    }
                }
            }
        }

        return maxDis;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值