给你一些区域列表 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