返回

深入浅出学1184.公交站间的距离

后端





## 问题剖析:

假设我们置身于一条环形公交线路中,该线路共有 n 个站点,编号从 0 到 n - 1,且遵循着固定的行驶方向。

为了计算从一个站点到另一个站点的最短距离,我们需要考虑两种情况:

- **顺时针方向:** 从起始站点出发,沿着公交线路顺时针行进。
- **逆时针方向:** 从起始站点出发,沿着公交线路逆时针行进。

## 解决方案 1:暴力枚举

最直接的解决方案是暴力枚举所有可能的路线,比较每条路线的总距离,并找出最短的一条。

1. **枚举起始站点:** 首先,我们需要枚举环形公交路线上所有的站点作为起始站点。
2. **枚举行驶方向:** 对于每个起始站点,我们需要枚举顺时针和逆时针两种行驶方向。
3. **计算总距离:** 对于每个起始站点和行驶方向,我们需要计算沿着该路线行驶的总距离。总距离等于从起始站点到目的站点的距离加上从目的站点返回起始站点的距离。
4. **比较距离:** 将所有路线的总距离进行比较,找出最短的一条路线。

## 解决方案 2:数学推导

除了暴力枚举之外,我们还可以通过数学推导来计算出最短距离。

1. **计算起始站点到目的站点的距离:** 首先,我们需要计算从起始站点到目的站点的距离。我们可以使用以下公式:

distance_direct = abs(start - end)


其中:

* distance_direct 表示起始站点到目的站点的直接距离。
* start 表示起始站点的编号。
* end 表示目的站点的编号。

2. **计算目的站点到起始站点的距离:** 接下来,我们需要计算从目的站点到起始站点的距离。我们可以使用以下公式:

distance_indirect = n - abs(start - end)


其中:

* distance_indirect 表示目的站点到起始站点的间接距离。
* n 表示公交线路上的站点总数。

3. **比较距离:** 将直接距离和间接距离进行比较,选择较小的距离作为最短距离。

## 代码示例:

```python
def find_shortest_distance(start, end, n):
  """
  计算从起始站点到目的站点的最短距离。

  Args:
    start: 起始站点的编号。
    end: 目的站点的编号。
    n: 公交线路上的站点总数。

  Returns:
    从起始站点到目的站点的最短距离。
  """

  # 计算直接距离。
  distance_direct = abs(start - end)

  # 计算间接距离。
  distance_indirect = n - abs(start - end)

  # 比较距离并返回最短距离。
  return min(distance_direct, distance_indirect)


# 测试代码。
start = 0
end = 2
n = 5
result = find_shortest_distance(start, end, n)
print(f"从起始站点 {start} 到目的站点 {end} 的最短距离是 {result}")

结语:

在本文中,我们详细介绍了两种解决 LeetCode 上第 1184 号问题“公交站间的距离”的方法:暴力枚举和数学推导。我们还提供了清晰的代码示例来帮助您理解和应用这些方法。现在,您已经掌握了解决此问题的两种有效途径,希望您能够在未来的编程实践中灵活运用它们。