问题描述
小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中:
- 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。
airports[0]为起点,airports[airports.length - 1]为终点。- 假设小C当前在机场
i,那么i - 1和i + 1(如果存在)代表邻近机场,飞机可以直接前往。 - 如果在机场
i,且存在airports[i] == airports[j],则机场i和机场j同属一家航空公司,可直接飞往。
求最小起飞次数。
测试样例
样例1:
输入:
airports = [10, 12, 13, 12, 14]
输出:3
样例2:
输入:
airports = [10, 11, 12, 13, 14]
输出:4
样例3:
输入:
airports = [7, 7, 7, 8, 9, 7]
输出:1
题目分析
这个问题可以看作是一个图的最短路径问题,机场和它们之间的飞行路线构成了一个图,目标是找到从起点机场到终点机场的最短飞行次数。
解题思路
每个机场是一个节点,机场之间的飞行线路可以通过相邻关系和相同航空公司来建图。如果当前机场i可以飞往机场i+1或i-1(即相邻机场),那么i和i+1、i-1之间有一条边。如果当前机场i与机场j有相同的航空公司,那么i和j之间也有一条边。
因为我们要找到最短路径,适合用BFS来进行层级遍历。BFS会从起点出发,逐步扩展到所有可达的机场,直到找到终点机场。 因为我们要找到最短路径,适合用BFS来进行层级遍历。BFS会从起点出发,逐步扩展到所有可达的机场,直到找到终点机场。
可以使用队列来存储当前要访问的机场。使用一个数组来记录每个机场到起点的最短飞行次数。从起点机场出发,每次处理一个机场,检查它相邻的机场和同航空公司机场,更新最短飞行次数。
代码分析
- 初始化队列,存储当前机场索引和起飞次数,并记录已访问的机场
queue = deque([(0, 0)])
visited = set([0])
- 检查是否到达终点机场
if current_index == n - 1:
return current_steps
- 将相邻机场加入队列
if current_index + 1 < n and (current_index + 1) not in visited:
queue.append((current_index + 1, current_steps + 1))
visited.add(current_index + 1)
if current_index - 1 >= 0 and (current_index - 1) not in visited:
queue.append((current_index - 1, current_steps + 1))
visited.add(current_index - 1)
- 将同一家航空公司的机场加入队列
for i in range(n):
if airports[i] == airports[current_index] and i != current_index and i not in visited:
queue.append((i, current_steps + 1))
visited.add(i)
- 如果无法到达终点机场,返回-1
return -1
完整代码如下:
from collections import deque
def solution(airports):
n = len(airports)
if n == 1:
return 0
queue = deque([(0, 0)])
visited = set([0])
while queue:
current_index, current_steps = queue.popleft()
if current_index == n - 1:
return current_steps
if current_index + 1 < n and (current_index + 1) not in visited:
queue.append((current_index + 1, current_steps + 1))
visited.add(current_index + 1)
if current_index - 1 >= 0 and (current_index - 1) not in visited:
queue.append((current_index - 1, current_steps + 1))
visited.add(current_index - 1)
for i in range(n):
if airports[i] == airports[current_index] and i != current_index and i not in visited:
queue.append((i, current_steps + 1))
visited.add(i)
return -1
总结
这段代码的思路是使用广度优先搜索(BFS)来找到从起点机场到终点机场的最短飞行次数。代码通过队列来逐步遍历机场,并根据相邻机场和相同航空公司机场的条件,逐层扩展,直到找到终点机场。
时间复杂度:O(n),因为每个机场最多只会被访问一次,且每次访问时只进行常数时间的操作。
空间复杂度:O(n),用来存储机场的最短飞行次数、队列、访问记录等。