阿D的最佳飞行路线探索| 豆包MarsCode AI 刷题

53 阅读4分钟

问题描述

小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中:

  • 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。
  • airports[0]为起点,airports[airports.length - 1]为终点。
  • 假设小C当前在机场i,那么i - 1i + 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),用来存储机场的最短飞行次数、队列、访问记录等。