1436-旅行终点站

Raphael Liu Lv10

给你一份旅游线路图,该线路图中的旅行线路用数组 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 "";
};

复杂度分析

  • 时间复杂度:O(nm),其中 n 是数组 paths 的长度,m 是城市名称的最大长度。

  • 空间复杂度:O(nm)。

 Comments
On this page
1436-旅行终点站