给你一些区域列表 regions ,每个列表的第一个区域都包含这个列表内所有其他区域。 很自然地,如果区域 X 包含区域 Y ,那么区域 X 比区域 Y 大。 给定两个区域 region1 和 region2 ,找到同时包含这两个区域的 最小 区域。 如果区域列表中 r1 包含 r2 和 r3 ,那么数据保证 r2 不会包含 r3 。 数据同样保证最小公共区域一定存在。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/sm… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
-
- 想建立一张map表格,将从属关系明确
-
- 将第一个区域的访问节点从属从在一张set表中,
-
- 第二个区域从属关系往上找,第一个找到的就是公共区域
拓展:
-
- 这个题类是二叉树找公共节点类型
-
- 连接关系和从属关系明确了就不难找出
/**
* @param {string[][]} regions
* @param {string} region1
* @param {string} region2
* @return {string}
*/
var findSmallestRegion = function(regions, region1, region2) {
const map = new Map()
for(const region of regions) {
for(let i = 1, len = region.length; i < len; i++) {
map.set(region[i], region[0])
}
}
const visited = new Set()
while(region1) {
visited.add(region1)
region1 = map.get(region1)
}
while(region2) {
if(visited.has(region2)) {
return region2
}
region2 = map.get(region2)
}
return ''
};