返回

LeetCode 681 - 旅行终点:巧用 Set 和 Map 在 JavaScript 中轻松寻路

前端

简介

在解决 LeetCode 681 - 旅行终点问题时,JavaScript 中的 Set 和 Map 数据结构提供了强大的工具,可以高效地查找和管理路径。这篇文章将引导您逐步完成使用 Set 和 Map 来解决此问题的过程,从算法的概述到代码示例和深入解释,让您全面理解这种方法。

算法概述

该算法使用 Set 和 Map 来表示路径图并执行深度优先搜索 (DFS) 以查找旅行终点。以下是算法步骤的简要概述:

  1. 创建一个 Set 来存储城市。
  2. 创建一个 Map,其中键为城市,值为相邻城市列表。
  3. 使用 DFS 从起始城市开始遍历路径图。
  4. 在 DFS 过程中,将访问过的城市添加到 Set 中。
  5. 如果当前城市没有相邻城市,则将其标记为终点。
  6. 继续 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 的道路上取得进步。