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

解析

好久不刷Leetcode了,得把他拾一拾,活跃活跃思维。毕竟要有一个目标,能提早完成最好。

言归正传,该题是求最近的heater,这个距离可以将所有的houses都warm。所以一般能想到的是先求最小后求最大,最小指的是距离最小,最大指的是最小距离的最大值,因为该最大值才能将所有的houses都暖到。
So,

  1. 对于最小值,需要求得每个house对于每个heater的最近的距离;
  2. 对于最大值,指的是最小值求得后,将该最小值和上一次的最小值进行比对,求其最大值。

最后要注意的是,首先要对两个数组进行排序。

代码(C语言)

int compLower(const void* a, const void* b) {
    return *((int*)a) - *((int*)b);
}

int calcMax(int a, int b) {
    return a > b ? a : b;
}

int findRadius(int* houses, int housesSize, int* heaters, int heatersSize){
    qsort(houses, housesSize, sizeof(int), compLower);
    qsort(heaters, heatersSize, sizeof(int), compLower);
    
    int minRadius = 0, j = 0;
    
    for (int i = 0; i < housesSize; ++i) {
        while ((j < heatersSize - 1) && (abs(heaters[j] - houses[i]) >=
                                         abs(heaters[j + 1] - houses[i]))) {
            ++j;        // Find the nearest heater
        }
        
        minRadius = calcMax(minRadius, abs(heaters[j] - houses[i]));
    }
    
    return minRadius;
}

需要说明的是,qsort函数中comp的定义为
ab时,a排在b后面。
另外,在提交时,max函数是没有的,需要定义mac函数。

你可能感兴趣的:(LeetCode 475. Heaters)