🚂 准时到达的列车最小时速
📝 题目描述
给你一个浮点数hour
,表示你到达办公室可用的总通勤时间。要到达办公室,你必须按给定次序乘坐n
趟列车。另给你一个长度为n
的整数数组dist
,其中dist[i]
表示第i
趟列车的行驶距离(单位是千米)。
每趟列车均只能在整点发车,所以你可能需要在两趟列车之间等待一段时间。例如,第1
趟列车需要1.5
小时,那你必须再等待0.5
小时,搭乘第2小时发车的第2
趟列车。
返回能满足你准时到达办公室所要求全部列车的最小正整数时速(单位:千米每小时),如果无法准时到达,则返回-1
。
本题生成的测试用例答案不超过 hour
的小数点后最多存在两位数字。
📋 代码模板
class Solution {
public int minSpeedOnTime(int[] dist, double hour) {
}
}
function minSpeedOnTime(dist: number[], hour: number): number {
}
💡 提示
中,小数点后最多存在两位数字
🚀 示例
🖊️ 题解
当所需时间
设
根据上述单调性,我们可以使用二分查找算法,找出满足条件
二分查找的下限可以设置为
综上所述,在区间
需要说明的是,在二分查找的
首先,考虑不等式左边,
其次,考虑不等式右边,
class Solution {
public int minSpeedOnTime(int[] dist, double hour) {
int n = dist.length;
if (n > Math.ceil(hour)) {
return -1;
}
long hr = Math.round(hour * 100);
int low = 1, high = (int) 1e7;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (check(dist, hr, mid)) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
private boolean check(int[] dist, long hr, int speed) {
int n = dist.length;
long requiredHour = 0;
for (int i = 0; i < n - 1; i++) {
requiredHour += (dist[i] + speed - 1) / speed;
}
requiredHour = 100 * (requiredHour * speed + dist[n - 1]);
return requiredHour <= hr * speed;
}
}
function minSpeedOnTime(dist: number[], hour: number): number {
const n = dist.length;
if (n > Math.ceil(hour)) {
return - 1;
}
const hr = Math.round(hour * 100);
const check = (speed: number): boolean => {
let requiredHour = 0;
for (let i = 0; i < n - 1; i++) {
requiredHour += Math.ceil(dist[i] / speed);
}
requiredHour = 100 * (requiredHour * speed + dist[n - 1]);
return requiredHour <= hr * speed;
}
let low = 1, high = 1e7;
while (low <= high) {
const mid = low + Math.floor((high - low) / 2);
if (check(mid)) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
💭 复杂度分析
基于二分查找
的解决方案的复杂度分析如下。
- 时间复杂度:
,其中 为二分查找的上下限之差, 为数组长度。 - 空间复杂度:
。