返回

力扣第285场周赛 - 统计道路上的碰撞次数

前端

引言

在激烈的技术竞技场中,力扣周赛俨然已成为一场场精彩纷呈的“格斗”。第285场周赛如约而至,一道名为“统计道路上的碰撞次数”的中等难度题目映入眼帘。这道题不仅考验着算法功底,更对选手们的思维敏捷度提出了不小的挑战。

题目剖析

题目了一条无限长的公路上有n辆汽车正在行驶,每辆车按顺序编号为0到n-1。汽车按照各自的速度从左到右行驶,当两辆车的速度差大于某一给定值时,就会发生碰撞。

算法设计

解决这道题的关键在于设计一种高效且可靠的碰撞检测算法。我们可以采用以下分步策略:

  1. 排序 :首先,将汽车按速度从小到大排序。
  2. 遍历 :从速度最小的汽车开始遍历,对于每辆车:
  3. 计算速度差 :计算该车与它前面的车的速度差。
  4. 判断碰撞 :如果速度差大于给定值,则发生碰撞。
  5. 更新计数 :记录碰撞次数并继续遍历。

实现细节

我们可以使用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场周赛的这道中等难度题目充分体现了算法与思维的结合。通过合理的设计和高效的实现,我们可以快速而准确地求解出碰撞次数,展现出算法工程师的强大实力。