【数组】【打卡第163道】:leetCode每日一题:475. 供暖器

1、题目描述

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

在加热器的加热半径范围内的每个房屋都可以获得供暖。

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

说明:所有供暖器都遵循你的半径标准,加热的半径也一样。

2、算法分析

思路:房屋左右侧的热水器,取距离小的那个,最终取的是所有房屋所需最大的那个半径。

首先对数组进行排序。

对房屋进行遍历,首先定义半径radio,供暖器的下标i,并初始化。

接下来遍历房屋,找到房屋左右侧的最小距离的供暖器。

找房屋右侧的供暖器。也就是遍历供暖器了

接下来分析供暖器的位置。有3种可能,供暖器在i == 0;供暖器i下标在heater.length的位置,供暖器的i在houses数组下标之间。

1、供暖器的位置在i == 0的位置

比如这种:houses[1,2,3,4,5,6,7],heaters[3,6], 此时heaters[0] = 3 ,3-1 = 2

2、 i == heaters.length说明i已经超出数组的范围了, 也就是i下标的供暖器是最后一个供暖器,此时需要比较加热半径radio和(houses[houses.length - 1] - heaters[heaters.length - 1]), 比如这种:houses[1,2,3,4,5,6,7,8,9],heaters[3,6],当i = 6的时候,houses后面还有一个7,8,9

3、要不然就是供暖器在房子左右两侧,比如: houses[1,2,3,4,5],heaters[2,5],此时i = 1,heaters[i] = 5,当house = 3的时候,当然取离供暖器2,5距离的最小值。5 - 3 = 2;3 - 2 = 1,取1

具体代码:

找一个例子模拟下:

houses[1,2,3,4,5,6,7],heaters[3,6]

3、代码实现

import java.util.*;
// 供暖器的最小加热半径
// 计算房屋左右侧的最小供暖器的距离,然后求出整个房屋求出房屋和供暖器的最大距离。
class Solution {
    public int findRadius(int[] houses, int[] heaters) {
        // 对houses,heaters进行排序
        Arrays.sort(houses);
        Arrays.sort(heaters);
        // 初始化加热半径和加热器的下标
        int radio = 0;
        int i = 0;
        // 遍历房屋,找到房屋左右侧的最小距离的供暖器
        for(int house:houses){
            // 先找到房屋右侧的供暖器
            while(i < heaters.length && house > heaters[i]){
                i++;
            }
            // 有3种可能,供暖器在i == 0;供暖器i下标在heater.length的位置,供暖器的i在houses数组下标之间
            // 1、供暖器的位置在i == 0的位置
            if(i == 0){
                // 比如这种:houses[1,2,3,4,5,6,7],heaters[3,6],
                // 此时heaters[0] = 3 ,3-1 = 2
                radio = Math.max(radio,heaters[i] - house);
            }else if(i == heaters.length){
                // i == heaters.length说明i已经超出数组的范围了
                // 也就是i下标的供暖器是最后一个供暖器
                // 此时需要比较加热半径radio和(houses[houses.length - 1] - heaters[heaters.length - 1])
                // 比如这种:houses[1,2,3,4,5,6,7,8,9],heaters[3,6],当i = 6的时候,houses后面还有一个7,8,9
                return Math.max(radio,houses[houses.length - 1] - heaters[heaters.length - 1]);
            }else{
                // 要不然就是供暖器在房子左右两侧
                // 比如: houses[1,2,3,4,5],heaters[2,5],此时i = 1,heaters[i] = 5,
                // 当house = 3的时候,当然取离供暖器2,5距离的最小值。5 - 3 = 2;3 - 2 = 1,取1
                radio = Math.max(radio,Math.min(heaters[i] - house,house - heaters[i - 1]));
            }
        }
        return radio;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值