【简单】算法:旅行终点站

170 阅读2分钟

旅行终点站

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

1436. 旅行终点站

算题

给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示其中 paths[i] = [cityAi, cityBi] 表示该线路将会从cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市 。题目数据保证线路图会形成一条不存在循环的线路,因此恰有一个旅行终点站。

示例 1:

输入:paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]
输出:"Sao Paulo" 
解释:从 "London" 出发,最后抵达终点站 "Sao Paulo" 。本次旅行的路线是 "London" -> "New York" -> "Lima" -> "Sao Paulo"

示例 2:

输入:paths = [["B","C"],["D","B"],["C","A"]]
输出:"A"
解释:所有可能的线路是:
"D" -> "B" -> "C" -> "A". 
"B" -> "C" -> "A". 
"C" -> "A". 
"A". 
显然,旅行终点站是 "A"

示例 3:

输入: paths = [["A","Z"]]
输出: "Z"

提示:

  • 1 <= paths.length <= 100
  • paths[i].length == 2
  • 1 <= cityAi.length, cityBi.length <= 10
  • cityAi != cityBi
  • 所有字符串均由大小写英文字母和空格字符组成。

解析:

保证所有 Path 首尾相连才是本题的关键,以 Path 第一个元素为起始和终点,在剩余的 Path 中找到 起始为上一个元素的终点的元素,这个元素的终点再次作为旅行的起始点,以此类推。。

样例:

[A,B], [C,D], [B,C]

A -> B

以B作为新的起始点,剩下元素中找到起始点为 B 的元素

B -> C

以C作为起始点,继续寻找

C -> D

剩余元素为空或找不到新的起始点为D

那么 D 就为旅行的终点

递归算法

var destCity = function (paths, index = 0) {
  const now = paths[index][1]; // 当前城市
  paths.splice(index, 1) // 删除当前城市
  if (paths.length === 0) {// 如果没有城市了,就是终点
    return now; // 返回终点
  }
  for (let index = 0; index < paths.length; index++) { // 遍历剩下的城市
    const stations = paths[index] // 当前城市
    if (stations[0] === now) { // 如果当前城市是终点
      return destCity(paths, index) // 递归
    }
  }
  return now // 如果没有找到终点,就返回当前城市
};

每一次递归都是在当前站点寻找下一站的起始点是否有匹配,递归退出的条件为剩余站点为空或生于站点的起始点不能匹配当前的终点。

最终返回当前站点,即为旅行的终点站

提交结果:

image.png