问题描述
小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
from collections import deque, defaultdict
def solution(airports):
n = len(airports)
# 记录同一航空公司所有机场的索引
company_map = defaultdict(list)
for i, company in enumerate(airports):
company_map[company].append(i)
# BFS 初始化
queue = deque([(0, 0)]) # (当前机场索引, 起飞次数)
visited = set()
visited.add(0)
while queue:
index, flights = queue.popleft()
# 如果到达终点
if index == n - 1:
return flights
# 访问相邻机场
for neighbor in (index - 1, index + 1):
if 0 <= neighbor < n and neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, flights + 1))
# 访问相同航空公司机场
for same_company_index in company_map[airports[index]]:
if same_company_index not in visited:
visited.add(same_company_index)
queue.append((same_company_index, flights + 1))
# 清空该航空公司,防止后续重复访问
company_map[airports[index]].clear()
if __name__ == "__main__":
# 测试用例
print(solution([10, 12, 13, 12, 14]) == 3) # 输出: True
print(solution([10, 11, 12, 13, 14]) == 4) # 输出: True
print(solution([7, 7, 7, 8, 9, 7]) == 1) # 输出: True