leetcode 1101. 彼此熟识的最早时间(C++)

本文介绍了一种算法,用于在一个社交圈子中找到所有人之间都熟识的最早时间。通过分析日志列表,该算法首先对日志进行排序,然后使用深度优先搜索(DFS)来确定何时所有人首次达到熟识状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个社交圈子当中,有 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. 1 <= N <= 100
  2. 1 <= logs.length <= 10^4
  3. 0 <= logs[i][0] <= 10^9
  4. 0 <= logs[i][1], logs[i][2] <= N - 1
  5. 保证 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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值