给你一份旅游线路图,该线路图中的旅行线路用数组 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
所有字符串均由大小写英文字母和空格字符组成。
方法一:哈希表 根据终点站的定义,终点站不会出现在 cityA}_i 中,因为存在从 cityA}_i 出发的线路,所以终点站只会出现在 cityB}_i 中。据此,我们可以遍历 cityB}_i,返回不在 cityA}_i 中的城市,即为答案。
代码实现时,可以先将所有 cityA}_i 存于一哈希表中,然后遍历 cityB}_i 并查询 cityB}_i 是否在哈希表中。
[sol1-Python3] 1 2 3 4 class Solution : def destCity (self, paths: List [List [str ]] ) -> str : citiesA = {path[0 ] for path in paths} return next (path[1 ] for path in paths if path[1 ] not in citiesA)
[sol1-C++] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution {public : string destCity (vector<vector<string>> &paths) { unordered_set<string> citiesA; for (auto &path : paths) { citiesA.insert (path[0 ]); } for (auto &path : paths) { if (!citiesA.count (path[1 ])) { return path[1 ]; } } return "" ; } };
[sol1-Java] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Solution { public String destCity (List<List<String>> paths) { Set<String> citiesA = new HashSet <String>(); for (List<String> path : paths) { citiesA.add(path.get(0 )); } for (List<String> path : paths) { if (!citiesA.contains(path.get(1 ))) { return path.get(1 ); } } return "" ; } }
[sol1-C#] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Solution { public string DestCity (IList<IList<string >> paths ) { ISet<string > citiesA = new HashSet<string >(); foreach (IList<string > path in paths) { citiesA.Add(path[0 ]); } foreach (IList<string > path in paths) { if (!citiesA.Contains(path[1 ])) { return path[1 ]; } } return "" ; } }
[sol1-Golang] 1 2 3 4 5 6 7 8 9 10 11 12 func destCity (paths [][]string ) string { citiesA := map [string ]bool {} for _, path := range paths { citiesA[path[0 ]] = true } for _, path := range paths { if !citiesA[path[1 ]] { return path[1 ] } } return "" }
[sol1-JavaScript] 1 2 3 4 5 6 7 8 9 10 11 12 var destCity = function (paths ) { const citiesA = new Set (); for (const path of paths) { citiesA.add (path[0 ]); } for (const path of paths) { if (!citiesA.has (path[1 ])) { return path[1 ]; } } return "" ; };
复杂度分析