LeetCode 1101. 彼此熟识的最早时间(排序+并查集)
文章目录
- 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. 彼此熟识的最早时间(排序+并查集)相关推荐
- LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)
文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一 ...
- LeetCode 2076. 处理含限制条件的好友请求(并查集)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示网络上的用户数目.每个用户按从 0 到 n - 1 进行编号. 给你一个下标从 0 开始的二维整数数组 restrictions ...
- LeetCode 1258. 近义词句子(哈希+并查集+排序+回溯)
文章目录 1. 题目 2. 解题 1. 题目 给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换 ...
- LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)
文章目录 1. 题目 2. 解题 1. Kruskal 2. prim 1. 题目 想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 con ...
- Leetcode 1436旅行终点站 拓扑排序 并查集与队列
题目介绍 题目难度: easy 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 ...
- [leetcode]778水位上升的泳池中游泳,并查集
本来想用二分的,但看到题面上限制的条件:N*N的二维数组,N小于等于50,而且还限制了二维数组的值是1 ~ N * N-1的排列,看完题解才知道能用并查集做. 题意 在时间为t的时候,水位也会上升到t ...
- Leetcode一起攻克搜索(BFS,DFS,回溯,并查集)
文章目录 BFS简介 DFS简介 回溯简介 并查集简介 DFS题目 690. 员工的重要性 1.dfs解法: 2.bfs算法 547.朋友圈 dfs解法 200.岛屿数量 dfs解法 417.太平洋大 ...
- leetcode 778. 水位上升的泳池中游泳(并查集)
在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时,此时雨水导致水池中任意位置的水位为 t .你 ...
- leetcode 1584. 连接所有点的最小费用(并查集)
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] . 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi ...
最新文章
- 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)
- style=background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)
- Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
- 电脑端跳转手机版的php代码,帝国CMS电脑端自动跳转到手机端移动端的方法
- 解释afterPropertiesSet
- 数学建模 割平面算法求解整数规划基本原理与编程实现
- Oracle命令--如何查看oracle中创建的所有目录
- 【BZOJ1912】【codevs1613】巡逻
- 7.23c++ STL自学笔记
- php获取当前域名、主机、URL、端口、参数、网址、路径、代理等
- CentOS 6.2目录服务之LDAP(一)
- Centos7安装配置NFS服务和挂载
- 后台java规范参数_详解Java后端优雅验证参数合法性
- 把生活过的像模像样已经很不容易
- Android Launcher 应用开发
- ADOBE AIR 技术
- JavaScript参考手册
- linux系统安装步骤
- 看云|专注于文档在线创作、协作、分享和托管
- 学计算机r7000和y7000哪个好,联想拯救者r7000p和y7000p哪个好-联想拯救者r7000p和y7000p评测对比...