🌈【LeetCode. 旅行终点】- JavaScript =>Set+Map

332 阅读3分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题意描述

给你一份旅游线路图,该线路图中的旅行线路用数组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中出现过的即可

具体实现:

  1. 将所有起点放入集合set
  2. 遍历所有终点,不在集合中的就是终点站
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;
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤