今日学习之最佳飞行路线探索

61 阅读3分钟

本次题目是: 小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中: 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。 airports[0]为起点,airports[airports.length - 1]为终点。假设小C当前在机场i,那么i - 1i + 1(如果存在)代表邻近机场,飞机可以直接前往。如果在机场i,且存在airports[i] == airports[j],则机场i和机场j同属一家航空公司,可直接飞往。 求最小起飞次数。 通过AI工具提醒,我们的解题步骤,从分析正确的思路开始为了找到从起点到终点的最小起飞次数,我们可以使用广度优先搜索(BFS)算法。BFS 非常适合解决这类最短路径问题,因为它会逐层扩展,确保我们找到的路径是最短的。 我们需要找到从起点 airports[0] 到终点 airports[airports.length - 1] 的最小起飞次数。飞机可以从当前机场飞往相邻机场(i-1i+1),或者飞往同一航空公司的其他机场。 首先,使用队列 Queue 来实现 BFS。其次,使用 Set 来记录已经访问过的机场,避免重复访问。初始化一个队列,将起点 airports[0] 和起飞次数 0 入队。然后,初始化一个 Set 来记录已经访问过的机场。

public class Main { public static int solution(int[] airports) { // 初始化队列和访问集合 Queue<int[]> queue = new LinkedList<>(); Set visited = new HashSet<>();

    // 将起点入队,起飞次数为0
    queue.offer(new int[]{0, 0});
    visited.add(0);
    
    // BFS 主循环
    while (!queue.isEmpty()) {
        int[] current = queue.poll();
        int index = current[0];
        int steps = current[1];
        
        // 如果当前机场是终点,返回起飞次数
        if (index == airports.length - 1) {
            return steps;
        }
        
        // 将相邻机场入队
        if (index > 0 && !visited.contains(index - 1)) {
            // 将左边的相邻机场入队
            queue.offer(new int[]{index - 1, steps + 1});
            visited.add(index - 1);
        }
        if (index < airports.length - 1 && !visited.contains(index + 1)) {
            // 将右边的相邻机场入队
            queue.offer(new int[]{index + 1, steps + 1});
            visited.add(index + 1);
        }
        // 将同一航空公司的机场入队
        for (int i = 0; i < airports.length; i++) {
            if (airports[i] == airports[index] && i != index && !visited.contains(i)) {
                // 将同一航空公司的机场入队
                queue.offer(new int[]{i, steps + 1});
                visited.add(i);
            }
        }
    }
    
    // 如果没有找到路径,返回-1(理论上不会执行到这里)
    return -1;
}

public static void main(String[] args) {
    int[] airports1 = {10, 12, 13, 12, 14};
    int[] airports2 = {10, 11, 12, 13, 14};
    System.out.println(solution(airports1) == 3);
    System.out.println(solution(airports2) == 4);
}

解决了此次学习问题后,我有了更多的思考,随着互联网的发展,计算机专业大类下各方向差别较大。所以,我可以利用课余时间学习不同方向的知识,并寻找机会进行实践。在这个过程中,一开始对计算机不算了解,可能不清楚自己的个性和兴趣所在,但通过广泛的尝试,我们肯定会对自己有全新的认识,找到与自己灵魂契合的兴趣点。为我们深入学习奠定基础,因为我们对某个领域有兴趣时,学习的动力会更足。