Count The Number of Passing Cars On the Road Problem in Java

2025年3月26日 | 阅读 4 分钟

计算道路上行驶汽车数量问题 是众多典型的算法问题之一,其实际目标是确定在同一条道路上朝相反方向行驶的汽车的所有有效对的数量。

更具体地说,该问题要求计算向东行驶的汽车(由 0 表示)与向西行驶的汽车(由 1 表示)的交汇数量。 挑战在于如何最有效地完成这项任务,即最好能达到 O(N) 的时间复杂度,其中 N 是 数组 的总元素数量。

问题概述

给定一个由 N 个整数组成的数组 A,每个元素代表一辆车的方向

'0' 表示一辆车向东行驶。

'1' 表示一辆车向西行驶。

任务是定义(多少)对 (P, Q) 存在,其中 P 小于 Q,位置 P 的元素等于 0 或 A[P] = 0,并且位置 Q 的元素等于 1 或 A[Q] = 1。

换句话说,您想了解一种量化从东方来的汽车会超车另一辆从西方来的汽车的概率的方法。

问题解决方案

该解决方案利用了一个事实,即对于每个向西行驶的汽车(1),它前面都有所有的向东行驶的汽车(0)。这使得我们可以在一次遍历数组的过程中计算出通过的对数,因此,时间复杂度为 O(N)。

我们维护两个计数器

num_east: 记录值为零(向东行驶)的汽车数量。

num_pass: 记录东方汽车超车西方汽车的通过对数。

对于数组的每一次迭代,如果东方汽车(0)的计数器增加一。对于每一辆向西行驶的汽车(1),我们将 num_east 的当前值加到 num_pass 变量 中,因为所有的东方汽车都会超过去向西行驶的汽车。

让我们在 Java 程序中实现上述方法。

示例

输出

 
Number of passing cars: 5   

注意事项和边缘情况

溢出处理: 在更新 num_pass 计数器的操作结构之后,代码中包含了溢出检查。这很重要,因为通过对的数量可能会急剧增加,以至于超出 1 000 000 000 的值。如果发生这种情况,函数 将返回 -1,这将表明发生了溢出情况。

边缘情况: 它还很好地处理了以下边缘情况:

  • 一个只包含 0 或 1 的数字数组,没有配对,将返回 0,这是正确的结果。
  • 一个没有汽车或只有一辆汽车的数组也将等于 0,因为没有什么可以比较或配对。

效率和性能

因此,时间与输入的大小成正比,对于较大的输入,所提供的解决方案是最优的:时间复杂度为 O(N)。它只需要遍历整个数组一次,因此在输入数组大小方面效率很高。由于只使用了几个整型变量,因此解决方案的空间复杂度为 O(1),这也使得解决方案在空间方面非常高效。

结论

这是一个使用数组和高效算法来解决计算道路上行驶汽车数量问题的良好实践。所提供的解决方案可以被认为是最佳且相对稳定的,因为它允许严格地实现单次遍历的通过对计数。

因此,它能够适应大型输入以及其他未知值,同时又能确保其结果的正确性以及运行时间在设定的限制范围内。