小美的朋友关系(美团春招机试) Python AC代码

这道题网上已经有标准的解法了,就是反向并查集,但是很少看到能真正A掉的Python代码(C++最容易A)。主要原因可以归于以下四个原因:

1、节点数目最大可以到1e9,因此并查集初始化父节点时,千万不要每个节点都去初始化,很容易超时或者爆掉内存,使用HashMap去解决,只去初始化关系中有的节点。

2、被删除的关系可能原本就不存在,反向查询时删除操作是并查集中的添加操作,因此这种不存在的关系需要避免被添加到并查集中,没有这个操作的话结果会错误。

3、由于某些节点在初始化关系中是不存在的,因此查询时也会出现查询节点不再HashMap中,这个需要单独写代码去单独判断因此会额外增加计算开销,我的做法是不去判断是否在HashMap中,直接使用 Try...catch,这样不在HashMap中的节点会引发索引异常,但程序不会被终止掉,在catch中去添加否认的结果就行,省掉一部分判断计算成本。

4、最后的结果打印,因为查询最大可以到1e5的数量级别,使用循环print结果,IO开销太大了,会超时,我的做法是直接把结果拼成一个字符串,然后一次print,大幅削减IO开销。

这道题使用Python需要很多细节处理才行。

import sys

inputs = []
for line in sys.stdin:
    inputs.append(line.split())

inputs = [list(map(lambda x: int(x), line)) for line in inputs]

n, m, q = inputs[0][0], inputs[0][1], inputs[0][2]
init_friendships = inputs[1:m + 1]
queries = inputs[m + 1:]

class UnionFind:
    def __init__(self):
        self.parents = {}
        for i in range(m):
            f = init_friendships[i]
            self.parents[f[0]] = f[0]
            self.parents[f[1]] = f[1]
    
    def find(self, i):
        if self.parents[i] != i:
            self.parents[i] = self.find(self.parents[i])

        return self.parents[i]

    def union(self, i, j):
        parent_i =  self.find(i)
        parent_j = self.find(j)

        self.parents[parent_i] = parent_j

friendships = set()
for ship in init_friendships:
    friendships.add(tuple(sorted(ship)))

for i in range(q):
    q_tmp = queries[i]
    if q_tmp[0] == 1:
        if tuple(sorted(q_tmp[1:])) not in friendships:
            queries[i] = None

for q in queries:
    if q is not None and q[0] == 1:
        friendships.discard(tuple(sorted(q[1:])))

union_find = UnionFind()
for ship in friendships:
    union_find.union(*ship)

res = []
for q in queries[::-1]:
    if q is not None:
        if q[0] == 1:
            union_find.union(q[1], q[2])
        else:
            try:
                res.append('Yes' if union_find.find(q[1]) == union_find.find(q[2]) else 'No')
            except BaseException:
                res.append('No')

# for r in res[::-1]:
#     print(r)

r = '\n'.join(res[::-1])
print(r)



全部评论

相关推荐

锐明技术一面:二面要线下 不想去没去1、什么是原型链2、vue2和vue3的区别3、三种存储方式有哪些localstorage和sessionstorage区别4、css垂直居中的方式5、组建之间的通信方式6、promise和settimeout的区别7、实现双向绑定的原理8、加密算法的区别9、webRTC反问意见:没有抓清楚回答的重点,面试官提问的重点小鹅通一面:二面基本都是问项目没有八股 已oc没去1.简单说一下webRTC的整个项目的实现2.为什么考虑使用虚拟列表3.虚拟列表是怎么实现的(实现原理)  可以考虑分页4.说一下怎么判断是否在可视区域5.JS常用的数据结构6.怎么理解闭包7.js继承怎么实现的8.js继承和C++继承有什么区别9.http常见的协议头10.日常访问网页的时候 有时候访问图片、视频 会让你下载 有时候又让你在网页预览 你怎么做,怎么理解的反问意见:需要加强业务上的思考。比如虚拟列表可能会占用内存等腾讯音乐一面:(kpi两次 面完秒挂 没有手撕)1.怎么解决跨域的问题?2.项目难点3.单点登录4.项目最大的收获5.Js数据类型6.怎么判断数组类型7.数组怎么去重(set怎么转数组)8.字符串怎么转为数组9.数组排序(指定升序排序)10.web页面 有哪些策略进行性能优化11.说一下CDN让访问变快的原理12.域名解析的过程13.浏览器缓存的原理14.什么情况下会命中强缓存(协商缓存)问的很细15.图片懒加载实现原理(需要更加底层)16.说一下浏览器dom渲染过程17.Http2/http3比http1优化的地方18.http状态码19.解决跨域的方法20.为什么有跨域的问题21.Xss攻击(怎么攻击 怎么解决这个攻击)22.为什么输入脚本可以攻击23.Js实现继承(很细)24.为什么父类的引用类型属性会被所有子类共享25.深拷贝实现26.如何在全局捕获js异常27.衡量页面性能的指标(需要答很多)28.Nodejs react反问意见:需要了解网络相关的底层原理美团一二面 已oc 决定去美团了八股基本都是类似的 手撕数组去重 能写多少写多少 用map去重第二次手撕是路径匹配 需要处理./ ../ 感觉美团想要你的话 问项目会问的比较多反问主要是问的他们那边的业务
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务