Leetcode 1257:最小公共区域

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

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

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

如果区域列表中 r1 包含 r2r3 ,那么数据保证 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" 

相似例题
Leetcode 236:二叉树的最近公共祖先


def findSmallestRegion(regions, region1, region2) :
    parent = {r: region[0] for region in regions for r in region[1:]}
    parent[regions[0][0]]=regions[0][0]

    if parent[region1]==region2:
        return region2
    if parent[region2]==region1:
        return region1
    if parent[region1]==parent[region2]:
        return parent[region1]
    return findSmallestRegion(regions,parent[region1],parent[region2])


if __name__ == "__main__":
    # print("please input 二维数组长度:")
    # m=int(input())
    # regions=[[] for _ in range (m)]
    # for i in range(m):
    #     line=input().split(',')
    #     for j in range(len(line)):
    #         regions[i].append(line[j])
    
    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 = "Boston"

    res=findSmallestRegion(regions,region1, region2)




非递规实现

def findSmallestRegion(regions, region1, region2) :
    parent = {r: region[0] for region in regions for r in region[1:]}
    parent[regions[0][0]]=regions[0][0]
    while (region1!=region2):
        if parent[region1]==region2:
            region1=region2
        elif parent[region2]==region1:
            region2=region1
        elif parent[region1]==parent[region2]:
            region1=parent[region1]
            region2=region1
        else:
            region1=parent[region1]
            region2=parent[region2]
    return region1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值