學了這麼久的資料結構了,還是有好些演算法並沒弄清楚,搞得有些筆試題都是沒有思路,今天就講講並查集。
感覺這東西吧,就是分圈子,乙個人自成乙個圈子,若分屬於兩個不同圈子的人在某時刻成了好朋友,那這兩個圈子就合併成了乙個圈子,最終在題目中形成多個圈子進行分析。
判斷兩個人是不是乙個圈子要不停的找朋友驗證,這就很麻煩,乙個圈子總要有個大boss吧,所以最好直接在合併圈子的時候直接從屬於乙個乙個老大,後面就查詢兩個人的老大是不是乙個就知道是否處於同一圈子。
可以看看這篇文章,講的挺好的。
學習演算法,就是要多刷題嘛,我覺得這個朋友圈就很經典,可以很快上手並查集演算法。當然,根據場景可更換資料結構進行並查集演算法的實現,比如hashmap.
下面是我自己在朋友圈這題中寫的**
class
solution
int n = m.length;
friend=
newint
[n];
// 初始化,每個人自成乙個圈子
for(
int i =
0;i < n;i++
)for
(int i =
0;i < n;i++)}
}// 查詢有多少個圈子,根據老大來判斷有多少圈子,只有老大的老大是自己
for(
int i =
0;i < n;i++)}
return res;
}// 查
intfind
(int x)
// 將自己的上級改為圈子老大
friend[x]
= boss;
return boss;
}// 並
void
union
(int x,
int y)
}}
並查集理解
作用 連通分量的查詢與合併 理解 1.將連通分量看成乙個集合,該集合包含了連通分量的所有點。連同方式無關緊要,只有屬於和不屬於與這個集合的區別。2.每個集合都可看成一棵樹,這個集合的標誌 這棵樹的標誌 就是這棵樹的根。3.如果把節點x的父親節點儲存在pre x 中,那麼再從pre x 找它的父親節點...
並查集的理解
並查集的模板,不理解也要背下來 include 萬能標頭檔案 using namespace std int par 100000 ran 10000 個數與深度 int n,m void init int n 初始化 當不需要返回值的時候,函式的型別標void。其實這個也是會返回乙個值,好像是呼叫...
並查集的理解
從數學的角度來說,假設我們有n個集合,而每個集合內又有眾多的元素,等等,每個集合的元素都存在這或多或少的聯絡,什麼聯絡不清楚,但我們只需知道存在這樣的關係即可 而突然,我們希望讓集合之間也聯絡起來,而又不想乙個乙個的將它們綁到一起,那麼,並查集就是解決它們之間聯絡的資料結構。樹就是我們需要用到的一種...