「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
给你一份旅游线路图,该线路图中的旅行线路用数组
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" 。
思路1:Set
对于一个paths[i] = [cityAi, cityBi],若城市出现在cityAi中,则必定会通向cityBi;同时终点站肯定在cityBi中。
所以只要找到cityBi中没有在cityAi中出现过的即可
具体实现:
- 将所有起点放入集合
set - 遍历所有终点,不在集合中的就是终点站
var destCity = function (paths) {
// 记录所有城市数
let set = new Set()
// 记录每个城市的出发次数
let map = {}
// 无法从该城市出发则为终点也就是该城市出发次数为0
paths.forEach(p => {
map[ p[0]] = map[ p[0]] ? map[ p[0]]++ : 1
set.add(p[0])
set.add(p[1])
})
let citys = [...set]
for(let c of citys){
if(!map[c])return c
}
};
思路2:hash
分析:主要思路在于找到终点所在的结点,所以我们的想法在于从paths中提取完整的前进路线,而在图论的思想里,我们追踪路径的一个朴素做法是引入一个数组,其索引代表终点的位置,索引处存储的值代表指向该点的起点,根据图论的思想,我们引入键值(key-value)对。其中key代表起点,value代表起点指向的下一个结点。
var destCity = function(paths) {
const map = {};
// 遍历,构建映射关系
for (const path of paths) {
map[path[0]] = path[1];
}
// 选择 paths[0][0] 为第一个出发地,选择任意一个路径的出发地点都可以
let cur = paths[0][0];
while (map[cur] !== undefined) {
// 如果当前出发地有目的地的话,就将目的地选为下一个出发地继续模拟
cur = map[cur];
}
return cur;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤