开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
1436.旅行终点站
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/de…
给你一份旅游线路图,该线路图中的旅行线路用数组 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 所有字符串均由大小写英文字母和空格字符组成。
解法
-
哈希表法: 遇到这种成对出现的一般是图关系,图关系一般使用字典的方式进行对照。本文需要知道那个地点没有对应的下一个地点,那个地点即为终点。这里用字典kv表示该点及以该点为起点的个数,如果v为0则表明该地点不是起始点,则为终点。
-
python
class Solution(object):
def destCity(self, paths):
"""
:type paths: List[List[str]]
:rtype: str
"""
n = len(paths)
d = {}
if n == 1:
return paths[0][-1]
for i in range(n):
path = paths[i]
p1, p2 = path
if p1 not in d:
d[p1] = 1
else:
d[p1] += 1
if p2 not in d:
d[p2] = 0
for k, v in d.items():
if v == 0:
return k
- c++
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 "";
}
};
复杂度分析
-
时间复杂度:O(n) 两次遍历
-
空间复杂度:O(N) 一个哈希表存储