返回
力扣第285场周赛 - 统计道路上的碰撞次数
前端
2023-11-28 08:26:49
引言
在激烈的技术竞技场中,力扣周赛俨然已成为一场场精彩纷呈的“格斗”。第285场周赛如约而至,一道名为“统计道路上的碰撞次数”的中等难度题目映入眼帘。这道题不仅考验着算法功底,更对选手们的思维敏捷度提出了不小的挑战。
题目剖析
题目了一条无限长的公路上有n辆汽车正在行驶,每辆车按顺序编号为0到n-1。汽车按照各自的速度从左到右行驶,当两辆车的速度差大于某一给定值时,就会发生碰撞。
算法设计
解决这道题的关键在于设计一种高效且可靠的碰撞检测算法。我们可以采用以下分步策略:
- 排序 :首先,将汽车按速度从小到大排序。
- 遍历 :从速度最小的汽车开始遍历,对于每辆车:
- 计算速度差 :计算该车与它前面的车的速度差。
- 判断碰撞 :如果速度差大于给定值,则发生碰撞。
- 更新计数 :记录碰撞次数并继续遍历。
实现细节
我们可以使用C++语言实现上述算法:
vector<int> getCollisionTimes(vector<int>& cars) {
int n = cars.size();
vector<int> collisionTimes(n, -1);
sort(cars.begin(), cars.end());
for (int i = 1; i < n; i++) {
int diff = cars[i] - cars[i - 1];
if (diff > 0) {
collisionTimes[i] = (long long)(cars[i - 1] - cars[i]) * 1.0 / diff;
}
}
return collisionTimes;
}
代码解析
sort(cars.begin(), cars.end())
:对汽车按速度排序。- 遍历每辆车,计算与前车的速度差。
- 如果速度差大于0(即前车速度更大),则计算碰撞时间。
- 将碰撞时间记录在
collisionTimes
数组中。
示例输入/输出
输入:
cars = [8, 4, 3, 2, 4]
speedLimit = 4
输出:
[1, -1, -1, -1, -1]
解释:
- 第1辆车与第2辆车在1秒后碰撞。
- 其余车辆不会发生碰撞。
总结
力扣第285场周赛的这道中等难度题目充分体现了算法与思维的结合。通过合理的设计和高效的实现,我们可以快速而准确地求解出碰撞次数,展现出算法工程师的强大实力。