解题思路
-
基本思路:
- 计算每路公交的总行程时间
- 找到在给定出发时间后最早的一班车
- 比较所有路线的到达时间
- 选择最早到达的路线
-
关键点:
- 计算每条线路的单程时间
- 考虑发车间隔
- 处理等待时间
代码
class TakeBuses {
public:
int chooseLine(vector<int>& stops, vector<int>& period,
vector<int>& interval, int n, int s) {
int minArrival = INT_MAX;
for(int i = 0; i < n; i++) {
// 计算单程时间
int totalTime = stops[i] * period[i]; // 总停站时间
totalTime += (stops[i] + 1) * 5; // 路程时间
// 计算最早可搭乘的班次
int waitTime = 0;
if(s % interval[i] != 0) {
waitTime = interval[i] - (s % interval[i]);
}
// 计算到达时间
int arrivalTime = s + waitTime + totalTime;
minArrival = min(minArrival, arrivalTime);
}
return minArrival;
}
};
import java.util.*;
public class TakeBuses {
public int chooseLine(int[] stops, int[] period,
int[] interval, int n, int s) {
int minArrival = Integer.MAX_VALUE;
for(int i = 0; i < n; i++) {
// 计算单程时间
int totalTime = stops[i] * period[i]; // 总停站时间
totalTime += (stops[i] + 1) * 5; // 路程时间
// 计算最早可搭乘的班次
int waitTime = 0;
if(s % interval[i] != 0) {
waitTime = interval[i] - (s % interval[i]);
}
// 计算到达时间
int arrivalTime = s + waitTime + totalTime;
minArrival = Math.min(minArrival, arrivalTime);
}
return minArrival;
}
}
class TakeBuses:
def chooseLine(self, stops, period, interval, n, s):
min_arrival = float('inf')
for i in range(n):
# Calculate total journey time
total_time = stops[i] * period[i] # Total stop time
total_time += (stops[i] + 1) * 5 # Journey time
# Calculate waiting time for next bus
wait_time = 0
if s % interval[i] != 0:
wait_time = interval[i] - (s % interval[i])
# Calculate arrival time
arrival_time = s + wait_time + total_time
min_arrival = min(min_arrival, arrival_time)
return min_arrival
算法及复杂度
- 算法:遍历比较法
- 时间复杂度:,其中 为公交路数
- 空间复杂度:,只使用常数额外空间