LeetCode-Python-1257. 最小公共区域(哈希表)

给你一些区域列表 regions ,每个列表的第一个区域都包含这个列表内所有其他区域。

很自然地,如果区域 X 包含区域 Y ,那么区域 X  比区域 Y 大。

给定两个区域 region1 和 region2 ,找到同时包含这两个区域的 最小 区域。

如果区域列表中 r1 包含 r2 和 r3 ,那么数据保证 r2 不会包含 r3 。

数据同样保证最小公共区域一定存在。

 

示例 1:

输入:
regions = [["Earth","North America","South America"],
["North America","United States","Canada"],
["United States","New York","Boston"],
["Canada","Ontario","Quebec"],
["South America","Brazil"]],
region1 = "Quebec",
region2 = "New York"
输出:"North America"
 

提示:

2 <= regions.length <= 10^4
region1 != region2
所有字符串只包含英文字母和空格,且最多只有 20 个字母。

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

思路:

首先建立一个哈希表dic,key是子区域,val是父区域,

这样通过这个哈希表dic,我们就可以一层层往上找更大的区域。

然后我们还需要另一个哈希表depth,key是每个区域,val是每个区域对应的区域的深度,区域越小,深度越大,

这样就可以判断对于每组 region1 和region2, 哪个区域的深度更小。

然后把深度更大的区域更新为它的父区域,继续比较。

时间复杂度:O(N)

空间复杂度:O(N )

这是我打双周赛的AC解,不过我打完之后发现,这个解依赖于一个前提:

即regions数组必须按region的区域从大到小排好序……

如果regions数组是任意顺序排列的,则该解不可行。

class Solution(object):
    def findSmallestRegion(self, regions, region1, region2):
        """
        :type regions: List[List[str]]
        :type region1: str
        :type region2: str
        :rtype: str
        """
        from collections import defaultdict
        dic = dict()
        depth = defaultdict(int)
        
        depth[regions[0][0]] = 0
        d = 1
        for reg in regions:
            parent = reg[0]
            for child in reg[1:]: # 遍历所有的子区域
                depth[child] = d
                dic[child] = parent
            d += 1

        while region1 != region2:
            if depth[region1] < depth[region2]: # region2 深度更大,更新它
                region2 = dic[region2]
            elif depth[region2] < depth[region1]: # region1 深度更大,更新它
                region1 = dic[region1]
            else: # region1 和 region2 深度相同,它们的父区域就是答案
                return dic[region1]

        return region1

第二种思路:

建立一个哈希表,key是每个儿子,val 是它的爹。

然后把region1 的所有祖宗找出来,再逐个对比region2的所有祖宗,

当第一次祖宗相同时,就说明找到了最近的公共祖先。

时间复杂度:O(N)

空间复杂度:O(N)

class Solution(object):
    def findSmallestRegion(self, regions, region1, region2):
        """
        :type regions: List[List[str]]
        :type region1: str
        :type region2: str
        :rtype: str
        """
        from collections import defaultdict
        dic = dict()
        for reg in regions:
            parent = reg[0]
            for child in reg[1:]: # 遍历所有的子区域
                dic[child] = parent

        ancestors_1 = set()
        while region1 in dic:
            ancestors_1.add(region1)
            region1 = dic[region1]
            
        while region2 not in ancestors_1 and region2 in dic:
            region2 = dic[region2]
            
        return region2

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值