在一个社交圈子当中,有 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]
思路:先按时间顺序排序,然后依次对数据进行判断,对其中一个容器进行dfs搜索,当ans==N时,即找到最早时间
C++
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b)
{
return a[0]<b[0];
}
void dfs(map<int,vector<int>>& tmp, int num, vector<int>& flag, vector<int>& ans)
{
if(flag[num])
{
flag[num]=0;
ans.push_back(num);
auto vec=tmp[num];
for(auto it:vec)
{
dfs(tmp,it,flag,ans);
}
}
}
int earliestAcq(vector<vector<int>>& logs, int N)
{
int m=logs.size();
sort(logs.begin(),logs.end(),cmp);
map<int,vector<int>> tmp;
for(auto it:logs)
{
tmp[it[1]].push_back(it[2]);
tmp[it[2]].push_back(it[1]);
vector<int> flag(N,1);
vector<int> ans;
dfs(tmp,it[1],flag,ans);
if(ans.size()==N)
{
return it[0];
}
}
return -1;
}
};