15-11阿D的最佳飞行路线探索(中)

问题描述

小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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值