日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2024/7/5 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2092. 找出知晓秘密的所有专家(并查集) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給你一個(gè)整數(shù) n ,表示有 n 個(gè)專(zhuān)家從 0 到 n - 1 編號(hào)。
另外給你一個(gè)下標(biāo)從 0 開(kāi)始的二維整數(shù)數(shù)組 meetings ,其中 meetings[i] = [xi, yi, timei] 表示專(zhuān)家 xi 和專(zhuān)家 yi 在時(shí)間 timei 要開(kāi)一場(chǎng)會(huì)。
一個(gè)專(zhuān)家可以同時(shí)參加 多場(chǎng)會(huì)議 。最后,給你一個(gè)整數(shù) firstPerson 。

專(zhuān)家 0 有一個(gè) 秘密 ,最初,他在時(shí)間 0 將這個(gè)秘密分享給了專(zhuān)家 firstPerson 。
接著,這個(gè)秘密會(huì)在每次有知曉這個(gè)秘密的專(zhuān)家參加會(huì)議時(shí)進(jìn)行傳播。更正式的表達(dá)是,每次會(huì)議,如果專(zhuān)家 xi 在時(shí)間 timei 時(shí)知曉這個(gè)秘密,那么他將會(huì)與專(zhuān)家 yi 分享這個(gè)秘密,反之亦然。

秘密共享是 瞬時(shí)發(fā)生 的。也就是說(shuō),在同一時(shí)間,一個(gè)專(zhuān)家不光可以接收到秘密,還能在其他會(huì)議上與其他專(zhuān)家分享。

在所有會(huì)議都結(jié)束之后,返回所有知曉這個(gè)秘密的專(zhuān)家列表。你可以按 任何順序 返回答案。

示例 1: 輸入:n = 6, meetings = [[1,2,5],[2,3,8],[1,5,10]], firstPerson = 1 輸出:[0,1,2,3,5] 解釋: 時(shí)間 0 ,專(zhuān)家 0 將秘密與專(zhuān)家 1 共享。 時(shí)間 5 ,專(zhuān)家 1 將秘密與專(zhuān)家 2 共享。 時(shí)間 8 ,專(zhuān)家 2 將秘密與專(zhuān)家 3 共享。 時(shí)間 10 ,專(zhuān)家 1 將秘密與專(zhuān)家 5 共享。 因此,在所有會(huì)議結(jié)束后,專(zhuān)家 01235 都將知曉這個(gè)秘密。示例 2: 輸入:n = 4, meetings = [[3,1,3],[1,2,2],[0,3,3]], firstPerson = 3 輸出:[0,1,3] 解釋: 時(shí)間 0 ,專(zhuān)家 0 將秘密與專(zhuān)家 3 共享。 時(shí)間 2 ,專(zhuān)家 1 與專(zhuān)家 2 都不知曉這個(gè)秘密。 時(shí)間 3 ,專(zhuān)家 3 將秘密與專(zhuān)家 0 和專(zhuān)家 1 共享。 因此,在所有會(huì)議結(jié)束后,專(zhuān)家 013 都將知曉這個(gè)秘密。示例 3: 輸入:n = 5, meetings = [[3,4,2],[1,2,1],[2,3,1]], firstPerson = 1 輸出:[0,1,2,3,4] 解釋: 時(shí)間 0 ,專(zhuān)家 0 將秘密與專(zhuān)家 1 共享。 時(shí)間 1 ,專(zhuān)家 1 將秘密與專(zhuān)家 2 共享,專(zhuān)家 2 將秘密與專(zhuān)家 3 共享。 注意,專(zhuān)家 2 可以在收到秘密的同一時(shí)間分享此秘密。 時(shí)間 2 ,專(zhuān)家 3 將秘密與專(zhuān)家 4 共享。 因此,在所有會(huì)議結(jié)束后,專(zhuān)家 01234 都將知曉這個(gè)秘密。示例 4: 輸入:n = 6, meetings = [[0,2,1],[1,3,1],[4,5,1]], firstPerson = 1 輸出:[0,1,2,3] 解釋: 時(shí)間 0 ,專(zhuān)家 0 將秘密與專(zhuān)家 1 共享。 時(shí)間 1 ,專(zhuān)家 0 將秘密與專(zhuān)家 2 共享,專(zhuān)家 1 將秘密與專(zhuān)家 3 共享。 因此,在所有會(huì)議結(jié)束后,專(zhuān)家 0123 都將知曉這個(gè)秘密。提示: 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

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-all-people-with-secret
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

2. 解題

參考:數(shù)據(jù)結(jié)構(gòu) 并查集

  • 按時(shí)間對(duì)會(huì)議進(jìn)行排序
  • 對(duì)相同時(shí)間進(jìn)行的會(huì)議進(jìn)行并查集合并操作,之后再次檢查,對(duì)不知道秘密的專(zhuān)家,撤銷(xiāo)合并操作(之前不知道這個(gè),導(dǎo)致一直超時(shí))
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){ // 時(shí)間相同的會(huì)議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{ // 兩人都不知道秘密,恢復(fù)他們的初始狀態(tài)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/

長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!

總結(jié)

以上是生活随笔為你收集整理的LeetCode 2092. 找出知晓秘密的所有专家(并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。