文章目录

  • 1. 题目
  • 2. 解题

1. 题目

在一个社交圈子当中,有 N 个人。每个人都有一个从 0 到 N-1 唯一的 id 编号。

我们有一份日志列表 logs,其中每条记录都包含一个非负整数的时间戳,以及分属两个人的不同 id,logs[i] = [timestamp, id_A, id_B]

每条日志标识出两个人成为好友的时间,友谊是相互的:如果 A 和 B 是好友,那么 B 和 A 也是好友。

如果 A 是 B 的好友,或者 A 是 B 的好友的好友,那么就可以认为 A 也与 B 熟识。

返回圈子里所有人之间都熟识的最早时间。如果找不到最早时间,就返回 -1 。

示例:
输入:logs = [[20190101,0,1],[20190104,3,4],[20190107,2,3],[20190211,1,5],[20190224,2,4],[20190301,0,3],[20190312,1,2],[20190322,4,5]],N = 6
输出:20190301
解释:
第一次结交发生在 timestamp = 20190101,0 和 1 成为好友,
社交朋友圈如下 [0,1], [2], [3], [4], [5]。
第二次结交发生在 timestamp = 20190104,3 和 4 成为好友,
社交朋友圈如下 [0,1], [2], [3,4], [5].
第三次结交发生在 timestamp = 20190107,2 和 3 成为好友,
社交朋友圈如下 [0,1], [2,3,4], [5].
第四次结交发生在 timestamp = 20190211,1 和 5 成为好友,
社交朋友圈如下 [0,1,5], [2,3,4].
第五次结交发生在 timestamp = 20190224,2 和 4 已经是好友了。
第六次结交发生在 timestamp = 20190301,0 和 3 成为好友,大家都互相熟识了。提示:1 <= N <= 100
1 <= logs.length <= 10^4
0 <= logs[i][0] <= 10^9
0 <= logs[i][1], logs[i][2] <= N - 1
保证 logs[i][0] 中的所有时间戳都不同
Logs 不一定按某一标准排序
logs[i][1] != logs[i][2]

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

2. 解题

参考数据结构:并查集

  • 先按时间排序
  • 按时间顺序合并两个人,检查是否只有一个团,如果是,返回当前时间
class dsu
{vector<int> f;
public: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);int fb = find(b);f[fa] = fb;}int find(int a){int origin = a;while(a != f[a])a = f[a];return f[origin] = a;}bool onlyOne(){int count = 0;for(int i = 0; i < f.size(); ++i){if(i == find(i))count++;if(count > 1)return false;}return true;}
};
class Solution {public:int earliestAcq(vector<vector<int>>& logs, int N) {sort(logs.begin(), logs.end(),[&](auto a, auto b){return a[0] < b[0];});dsu u(N);for(auto& lg : logs){u.merge(lg[1], lg[2]);if(u.onlyOne())return lg[0];}return -1;}
};

244 ms 32.4 MB

  • 或者,有效的合并 N-1次就完成了
class dsu
{vector<int> f;
public: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);int fb = find(b);f[fa] = fb;}bool weAreFriend(int a, int b){int fa = find(a);int fb = find(b);return fa == fb;}int find(int a){int origin = a;while(a != f[a])a = f[a];return f[origin] = a;}
};
class Solution {public:int earliestAcq(vector<vector<int>>& logs, int N) {sort(logs.begin(), logs.end(),[&](auto a, auto b){return a[0] < b[0];});dsu u(N);for(auto& lg : logs){if(!u.weAreFriend(lg[1], lg[2])){    //不是朋友时,才进行合并u.merge(lg[1], lg[2]);N--;if(N==1)//合并了N-1次,找到了return lg[0];}}return -1;}
};

240 ms 32.3 MB


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

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

LeetCode 1101. 彼此熟识的最早时间(排序+并查集)相关推荐

  1. LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一 ...

  2. LeetCode 2076. 处理含限制条件的好友请求(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示网络上的用户数目.每个用户按从 0 到 n - 1 进行编号. 给你一个下标从 0 开始的二维整数数组 restrictions ...

  3. LeetCode 1258. 近义词句子(哈希+并查集+排序+回溯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换 ...

  4. LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)

    文章目录 1. 题目 2. 解题 1. Kruskal 2. prim 1. 题目 想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 con ...

  5. Leetcode 1436旅行终点站 拓扑排序 并查集与队列

    题目介绍 题目难度: easy 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 ...

  6. [leetcode]778水位上升的泳池中游泳,并查集

    本来想用二分的,但看到题面上限制的条件:N*N的二维数组,N小于等于50,而且还限制了二维数组的值是1 ~ N * N-1的排列,看完题解才知道能用并查集做. 题意 在时间为t的时候,水位也会上升到t ...

  7. Leetcode一起攻克搜索(BFS,DFS,回溯,并查集)

    文章目录 BFS简介 DFS简介 回溯简介 并查集简介 DFS题目 690. 员工的重要性 1.dfs解法: 2.bfs算法 547.朋友圈 dfs解法 200.岛屿数量 dfs解法 417.太平洋大 ...

  8. leetcode 778. 水位上升的泳池中游泳(并查集)

    在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时,此时雨水导致水池中任意位置的水位为 t .你 ...

  9. leetcode 1584. 连接所有点的最小费用(并查集)

    给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] . 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi ...

最新文章

  1. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)
  2. style=background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)
  3. Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
  4. 电脑端跳转手机版的php代码,帝国CMS电脑端自动跳转到手机端移动端的方法
  5. 解释afterPropertiesSet
  6. 数学建模 割平面算法求解整数规划基本原理与编程实现
  7. Oracle命令--如何查看oracle中创建的所有目录
  8. 【BZOJ1912】【codevs1613】巡逻
  9. 7.23c++ STL自学笔记
  10. php获取当前域名、主机、URL、端口、参数、网址、路径、代理等
  11. CentOS 6.2目录服务之LDAP(一)
  12. Centos7安装配置NFS服务和挂载
  13. 后台java规范参数_详解Java后端优雅验证参数合法性
  14. 把生活过的像模像样已经很不容易
  15. Android Launcher 应用开发
  16. ADOBE AIR 技术
  17. JavaScript参考手册
  18. linux系统安装步骤
  19. 看云|专注于文档在线创作、协作、分享和托管
  20. 学计算机r7000和y7000哪个好,联想拯救者r7000p和y7000p哪个好-联想拯救者r7000p和y7000p评测对比...

热门文章

  1. Flask-DebugToolbar的配置
  2. 【python】pycharm启动 一直index,无法运行
  3. python中自动化办公 【笔记】
  4. C# 对Ini文件操作(C# ini文件操作类)
  5. uboot中的虚拟地址映射
  6. k8s基础学习-存储卷
  7. 服务网关zuul之二:过滤器--请求过滤执行过程(源码分析)
  8. [POJ3252]Round Number(数位dp)
  9. WinForm邮件内容编辑器的简单实现
  10. USACO2.11 The Castle hdu1198