本次题目是:
小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中:
数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。 airports[0]为起点,airports[airports.length - 1]为终点。假设小C当前在机场i,那么i - 1和i + 1(如果存在)代表邻近机场,飞机可以直接前往。如果在机场i,且存在airports[i] == airports[j],则机场i和机场j同属一家航空公司,可直接飞往。
求最小起飞次数。
通过AI工具提醒,我们的解题步骤,从分析正确的思路开始为了找到从起点到终点的最小起飞次数,我们可以使用广度优先搜索(BFS)算法。BFS 非常适合解决这类最短路径问题,因为它会逐层扩展,确保我们找到的路径是最短的。
我们需要找到从起点 airports[0] 到终点 airports[airports.length - 1] 的最小起飞次数。飞机可以从当前机场飞往相邻机场(i-1 和 i+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);
}
解决了此次学习问题后,我有了更多的思考,随着互联网的发展,计算机专业大类下各方向差别较大。所以,我可以利用课余时间学习不同方向的知识,并寻找机会进行实践。在这个过程中,一开始对计算机不算了解,可能不清楚自己的个性和兴趣所在,但通过广泛的尝试,我们肯定会对自己有全新的认识,找到与自己灵魂契合的兴趣点。为我们深入学习奠定基础,因为我们对某个领域有兴趣时,学习的动力会更足。