力扣774:Minimize Max Distance to Gas Station

举报
奥利AO 发表于 2021/06/27 17:14:34 2021/06/27
【摘要】 力扣 Minimize Max Distance to Gas Station

力扣774:Minimize Max Distance to Gas Station


Problem:

On a horizontal number line, we have gas stations at positions stations[0], stations1, …, 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.


思路:

拿到题目的第一想法是用贪心法求解,每次选取距离最大的两个节点,然后再从之间插入新的节点,然而这种思路面临的问题是,首先我不知道在哪两个新的节点插入,要插多少个新的节点也无法得知。
换个想法,如果一开始我们已经知道了最大间隔是多少,那么我们就也就知道现在两个节点的间隔是不是满足最大间隔的要求,如果不满足,我们就必须添加新的节点来让他满足此要求,这样,对于每一个间隔,我们是知道需要添加的站点的数目的。如果总的添加数目小于K,证明我们还可以继续添加,直到添加的数目大于K为止。


(```
public class Solution {
public double minmaxGasDist(int[] stations, int k){
int len = stations.length;
int []temp = new int[len-1];
for(int i = 0; i < len-1; i++){
temp[i] = stations[i+1] - stations[i];
}
double lf = 0;
double rf = Integer.MAX_VALUE;
double eps = 1e-7;
while (Math.abs(rf- lf) > eps){
double mid = (rf + lf)/2;
if(check(temp, mid, k)){
rf = mid;
}else{
lf = mid;
}
}
return lf;
}

private boolean check(int[] gap, double mid, int k){
    int count = 0;
    for(int i = 0; i < gap.length; i++){
        count += (int)(gap[i]/mid);
    }
    return count < k;
}

}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。