文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。
另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。
一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。

专家 0 有一个 秘密 ,最初,他在时间 0 将这个秘密分享给了专家 firstPerson
接着,这个秘密会在每次有知晓这个秘密的专家参加会议时进行传播。更正式的表达是,每次会议,如果专家 xi 在时间 timei 时知晓这个秘密,那么他将会与专家 yi 分享这个秘密,反之亦然。

秘密共享是 瞬时发生 的。也就是说,在同一时间,一个专家不光可以接收到秘密,还能在其他会议上与其他专家分享。

在所有会议都结束之后,返回所有知晓这个秘密的专家列表。你可以按 任何顺序 返回答案。

示例 1:
输入:n = 6, meetings = [[1,2,5],[2,3,8],[1,5,10]], firstPerson = 1
输出:[0,1,2,3,5]
解释:
时间 0 ,专家 0 将秘密与专家 1 共享。
时间 5 ,专家 1 将秘密与专家 2 共享。
时间 8 ,专家 2 将秘密与专家 3 共享。
时间 10 ,专家 1 将秘密与专家 5 共享。
因此,在所有会议结束后,专家 0、1、2、3 和 5 都将知晓这个秘密。示例 2:
输入:n = 4, meetings = [[3,1,3],[1,2,2],[0,3,3]], firstPerson = 3
输出:[0,1,3]
解释:
时间 0 ,专家 0 将秘密与专家 3 共享。
时间 2 ,专家 1 与专家 2 都不知晓这个秘密。
时间 3 ,专家 3 将秘密与专家 0 和专家 1 共享。
因此,在所有会议结束后,专家 0、1 和 3 都将知晓这个秘密。示例 3:
输入:n = 5, meetings = [[3,4,2],[1,2,1],[2,3,1]], firstPerson = 1
输出:[0,1,2,3,4]
解释:
时间 0 ,专家 0 将秘密与专家 1 共享。
时间 1 ,专家 1 将秘密与专家 2 共享,专家 2 将秘密与专家 3 共享。
注意,专家 2 可以在收到秘密的同一时间分享此秘密。
时间 2 ,专家 3 将秘密与专家 4 共享。
因此,在所有会议结束后,专家 0、1、2、3 和 4 都将知晓这个秘密。示例 4:
输入:n = 6, meetings = [[0,2,1],[1,3,1],[4,5,1]], firstPerson = 1
输出:[0,1,2,3]
解释:
时间 0 ,专家 0 将秘密与专家 1 共享。
时间 1 ,专家 0 将秘密与专家 2 共享,专家 1 将秘密与专家 3 共享。
因此,在所有会议结束后,专家 0、1、2 和 3 都将知晓这个秘密。提示:
2 <= n <= 10^5
1 <= meetings.length <= 10^5
meetings[i].length == 3
0 <= xi, yi <= n - 1
xi != yi
1 <= timei <= 10^5
1 <= firstPerson <= n - 1

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

2. 解题

参考:数据结构 并查集

  • 按时间对会议进行排序
  • 对相同时间进行的会议进行并查集合并操作,之后再次检查,对不知道秘密的专家,撤销合并操作(之前不知道这个,导致一直超时)
class dsu{public:vector<int> f;dsu(int n){f.resize(n);for(int i = 0; i < n; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a), fb = find(b);f[fa] = fb;}int find(int a){if(a == f[a]) return a;return f[a] = find(f[a]);}void unmerge(int a){f[a] = a;}
};
class Solution {public:vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) {int mlen = meetings.size();vector<bool> known(n, false);known[0] = known[firstPerson] = true;sort(meetings.begin(), meetings.end(),[&](auto& a, auto& b){return a[2] < b[2];});dsu uset(n);for(int i = 0; i < mlen; ){int t = meetings[i][2], j = i;while(j < mlen && meetings[j][2]==t){   // 时间相同的会议int a = meetings[j][0], b = meetings[j][1];int f1 = uset.find(a);int f2 = uset.find(b);if(known[f2]) // b 知道秘密uset.merge(a, b);//有顺序的,注意!!!elseuset.merge(b, a);j++;}for(int k = i; k < j; ++k){int a = meetings[k][0], b = meetings[k][1];int f1 = uset.find(a);int f2 = uset.find(b);if(known[f1] || known[f2])known[a]=known[b]=true;else{ // 两人都不知道秘密,恢复他们的初始状态uset.unmerge(a);uset.unmerge(b);}}i = j;}vector<int> ans;for(int i = 0; i < n; ++i)if(known[i])ans.push_back(i);return ans;}
};

600 ms 130.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 2092. 找出知晓秘密的所有专家(并查集)相关推荐

  1. 找出知晓秘密的所有专家(leetcode 2092)

    题目描述 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号.另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, tim ...

  2. 5941. 找出知晓秘密的所有专家

    给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号.另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, timei] 表 ...

  3. 找出知晓秘密的所有专家

    题目描述 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号.另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, tim ...

  4. 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)

    约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...

  5. LeetCode 1823. 找出游戏的获胜者

    LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...

  6. LeetCode 2028. 找出缺失的观测数据

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   现有一份 n + m次 ...

  7. LeetCode 2058. 找出临界点之间的最小和最大距离

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   链表中的 临界点 定义 ...

  8. LeetCode 2094. 找出 3 位偶数

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9).数组中可能存在重复元素. 你需要找出 所有 满足下述条件且 互不相同 的整数: 该 ...

  9. LeetCode 1901. 找出顶峰元素 II(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 一个 2D 网格中的 顶峰元素 是指那些 严格大于 其相邻格子(上.下.左.右)的元素. 给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中 ...

最新文章

  1. 对javascript作用域链的理解
  2. 富文本编辑器Quill(二)上传图片与视频
  3. java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别
  4. 深度学习和目标检测系列教程 7-300:先进的目标检测Faster R-CNN架构
  5. 移动开发框架,第【一】弹:QuoJs 官方文档(汉化版)
  6. ReactiveCocoa详解
  7. 第二周四则运算汇报及总结
  8. 谈谈如何优化MYSQL数据库查询
  9. Dbgview,本机内核打印的注册表配置
  10. 3dsMax批量设置可编辑样条线的视口渲染
  11. kali扫描内网ip_kali 局域网嗅探
  12. Laravel5.5 项目开发文档,精简版,不适合新手使用。
  13. 测序中,什么是“测通”
  14. led照明灯哪个牌子的比较好?质量超好的LED护眼台灯推荐
  15. 数字调制解调—2ASK
  16. STM32 启动代码分析
  17. 编译原理 期末考试复习题
  18. 《人机交互技术》第一章 绪论 知识点整理
  19. Cisco AP 配置
  20. Flutter 生日验证正则

热门文章

  1. Django REST framework 认证、权限和频率组件
  2. 【R】语言第五课----画图
  3. 大数据之Spark集群安装及简单使用
  4. oracle的env函数用法,env命令_Linux env 命令用法详解:显示系统中已存在的环境变量...
  5. 数据有序_Redis实战(3)-数据结构List实战一之商品信息的有序存储
  6. 计算机统考分数短信显示合格,今年起全省八年级网考信息技术 成绩不合格不能升高中...
  7. 课外知识----浏览器存储技术
  8. 【尺取或dp】codeforces C. An impassioned circulation of affection
  9. 【BZOJ 3191】[JLOI2013]卡牌游戏
  10. about window.onload