力扣刷题日记-1257. 最小公共区域

84 阅读1分钟

给你一些区域列表 regions ,每个列表的第一个区域都包含这个列表内所有其他区域。 很自然地,如果区域 X 包含区域 Y ,那么区域 X  比区域 Y 大。 给定两个区域 region1 和 region2 ,找到同时包含这两个区域的 最小 区域。 如果区域列表中 r1 包含 r2 和 r3 ,那么数据保证 r2 不会包含 r3 。 数据同样保证最小公共区域一定存在。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/sm… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
    1. 想建立一张map表格,将从属关系明确
    1. 将第一个区域的访问节点从属从在一张set表中,
    1. 第二个区域从属关系往上找,第一个找到的就是公共区域
拓展:
    1. 这个题类是二叉树找公共节点类型
    1. 连接关系和从属关系明确了就不难找出
/**
 * @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 ''
};