返回
LeetCode 681 - 旅行终点:巧用 Set 和 Map 在 JavaScript 中轻松寻路
前端
2024-02-08 06:01:11
简介
在解决 LeetCode 681 - 旅行终点问题时,JavaScript 中的 Set 和 Map 数据结构提供了强大的工具,可以高效地查找和管理路径。这篇文章将引导您逐步完成使用 Set 和 Map 来解决此问题的过程,从算法的概述到代码示例和深入解释,让您全面理解这种方法。
算法概述
该算法使用 Set 和 Map 来表示路径图并执行深度优先搜索 (DFS) 以查找旅行终点。以下是算法步骤的简要概述:
- 创建一个 Set 来存储城市。
- 创建一个 Map,其中键为城市,值为相邻城市列表。
- 使用 DFS 从起始城市开始遍历路径图。
- 在 DFS 过程中,将访问过的城市添加到 Set 中。
- 如果当前城市没有相邻城市,则将其标记为终点。
- 继续 DFS 直到所有路径都被遍历或找到终点。
代码示例
const findItinerary = (paths) => {
// 创建城市集合
const cities = new Set();
// 创建城市相邻关系映射
const adjacencyMap = new Map();
// 构建图
for (const path of paths) {
cities.add(path[0]);
cities.add(path[1]);
if (adjacencyMap.has(path[0])) {
adjacencyMap.get(path[0]).push(path[1]);
} else {
adjacencyMap.set(path[0], [path[1]]);
}
}
// 从起始城市开始 DFS
let result = dfs(adjacencyMap, "JFK");
// 返回旅行终点
return result.length > 0 ? result : ["None"];
};
const dfs = (adjacencyMap, currentCity, visited = new Set()) => {
// 将当前城市标记为已访问
visited.add(currentCity);
// 获取当前城市的相邻城市
const neighbors = adjacencyMap.get(currentCity);
// 递归 DFS 相邻城市
let paths = [];
for (const neighbor of neighbors) {
if (!visited.has(neighbor)) {
paths = paths.concat(dfs(adjacencyMap, neighbor, visited));
}
}
// 返回当前城市的路径
return [currentCity].concat(paths);
};
详细解释
构建图:
首先,我们使用 Set 和 Map 来构建图。Set 存储所有城市,而 Map 存储城市到其相邻城市列表的映射。
DFS:
然后,我们使用 DFS 从起始城市遍历图。在 DFS 过程中,我们将访问过的城市添加到 Set 中。如果当前城市没有相邻城市,则将其标记为终点。
返回旅行终点:
DFS 遍历所有路径后,我们会将所有访问过的城市按顺序添加到结果列表中。如果找不到终点,则结果列表为空。
优点
使用 Set 和 Map 来解决 LeetCode 681 - 旅行终点问题有以下优点:
- 高效的路径查找: Set 和 Map 允许快速查找和管理路径,从而提高 DFS 算法的效率。
- 简洁的代码: Set 和 Map 提供了简洁且易于理解的语法,从而使算法易于实现。
- 可扩展性: Set 和 Map 非常适合处理大规模路径图,使算法可扩展到复杂的问题。
结论
使用 Set 和 Map 来解决 LeetCode 681 - 旅行终点问题是一种高效且优雅的方法。通过本文提供的逐步指南、代码示例和深入解释,您已经掌握了使用 Set 和 Map 在 JavaScript 中进行路径查找的技巧。从现在开始,您可以自信地解决此类问题,并在 LeetCode 的道路上取得进步。