• 【力扣 080】475. 供暖器


    475. 供暖器

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

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

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

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

    示例 1:

    输入: houses = [1,2,3], heaters = [2]
    输出: 1
    解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
    示例 2:

    输入: houses = [1,2,3,4], heaters = [1,4]
    输出: 1
    解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
    示例 3:

    输入:houses = [1,5], heaters = [2]
    输出:3
     

    提示:

    1 <= houses.length, heaters.length <= 3 * 104
    1 <= houses[i], heaters[i] <= 109

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/heaters
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    方法一:二分法

    代码实现:

    class Solution {
    public:
        int findRadius(vector<int>& houses, vector<int>& heaters) 
        {
            sort(houses.begin(), houses.end());
            sort(heaters.begin(), heaters.end());
            int l = 0, r = 1e9, mid;
            while(l < r)
            {
                mid = l + (r-l)/2;
                if(check(houses, heaters, mid)) r = mid;
                else l = mid + 1;
            }
            return l;
        }
    
        bool check(vector<int> &houses, vector<int> &heaters, int x)
        {
            int n = houses.size(), m = heaters.size();
            for(int i = 0, j = 0; i < n; ++i)
            {
                while(j < m && houses[i] > heaters[j] + x)  ++j;
                if(j < m && heaters[j] - x <= houses[i] && houses[i] <= heaters[j] +x ) continue;
                return  false;
            }
            return true;
        }
    };
  • 相关阅读:
    dfs-入门模板
    dp-状压dp
    c++ sizeof详解
    各种排序算法
    简介
    第178场周赛总结
    单调队列
    2019.10.24刷题统计
    2019.10.23刷题统计
    2019.10.22刷题统计
  • 原文地址:https://www.cnblogs.com/sunbines/p/16321651.html
Copyright © 2020-2023  润新知