On a horizontal number line, we have gas stations at positions stations[0], stations[1], ..., stations[N-1]
, where N = stations.length
.
Now, we add K
more gas stations so that D, the maximum distance between adjacent gas stations, is minimized.
Return the smallest possible value of D.
Example:
Input: stations = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], K = 9
Output: 0.500000
Note:
stations.length
will be an integer in range[10, 2000]
.stations[i]
will be an integer in range[0, 10^8]
.K
will be an integer in range[1, 10^6]
.- Answers within
10^-6
of the true value will be accepted as correct.
思路:就是如果加入0个station,那么上限就是现在的max adjcent distance, 如果加入无穷多个station,那么下限就是distance = 0;那么就是要找到恰当的dis 使得加入的station是K,那么就是个二分答案的binary search,辅助方程是求给你distance,求要加入多少个stations. 求station 个数就用station[i] - station[i-1] / dis 注意double的判断,不用用start + 1 < end,要用eps = 1e-6 , start + eps < end来判断;
class Solution {
public double minmaxGasDist(int[] stations, int k) {
if(stations == null || stations.length == 0) {
return 0.0;
}
double start = 0;
double end = 0;
for(int i = 1; i < stations.length; i++) {
end = Math.max(end, stations[i] - stations[i - 1]);
}
double eps = 1e-6;
while(start + eps < end) {
double mid = start + (end - start) / 2;
if(canfit(mid, stations) > k) {
start = mid;
} else {
end = mid;
}
}
if(canfit(start, stations) > k) {
return end;
}
return start;
}
private int canfit(double distance, int[] stations) {
int count = 0;
for(int i = 1; i < stations.length; i++) {
double diff = stations[i] - stations[i - 1];
count += diff / distance;
}
return count;
}
}