leetcode 旅行终点站(每日计划)

115 阅读2分钟

给你一份旅游线路图,该线路图中的旅行线路用数组 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
  • 所有字符串均由大小写英文字母和空格字符组成。

我的初次算法实现:

/**
 * @param {string[][]} paths
 * @return {string}
 */
var destCity = function (paths) {
  let map = {};
  paths.forEach(([key, value]) => {
    map[key] = value;
  });
  let key = paths[0][0];
  while (map[key]) {
    key = map[key];
  }
  return key;
};

这个就是先将所有的情况保存到 map 中,然后逐一取值,这个就是利用 map 的查找会比数组遍历的次数变少,也就是少做无用功。

使用的数组的方式进行:

/**
 * @param {string[][]} paths
 * @return {string}
 */
var destCity = function (paths) {
  let det = paths[0][1];
  let flag = false;
  let obj = {};
  for (let i = 1; i < paths.length; i++) {
    if (paths[i][0] === det && !obj[i]) {
      flag = true;
      det = paths[i][1];
      obj[i] = true;
    }

    if (i === paths.length - 1 && flag) {
      flag = false;
      i = -1;
    }
  }
  return det;
};

我也通过了一些变量在一定程度上让循环的次数也降低了,这样提交的结果居然要大于上面的那种,具体分析的话,最主要的是少了第一次的循环,但由于需要过滤掉已经比较过的,需要格外的开辟空间和一些必要的比较,导致总体并不比上面的好太多,只是稍微好点。


来源:力扣(LeetCode)