簡單的修改一下原始的並查集,來判斷剩下的集合的數量
class
dsu:
def__init__
(self,nodecount)
: self.node_relation_list=[-
1]*nodecount#初始化,每個節點的祖先都是自己,記住-1,這裡node_count為節點總數
deffind_ancestors
(self,node)
:# 首先,是找到自己所在集合的最上面那一層的祖先,若不為值不為-1,說明當前自己的祖先並不是最終祖先,迴圈進行上司再去找他的祖先,直到找到最終祖先
temp=node
while self.node_relation_list[node]!=-
1:node=self.node_relation_list[node]
if temp!=node:
#路勁壓縮,使得所有節點的祖先都是最終的祖先
self.node_relation_list[temp]
=node
return node
defmerge_ancestors
(self,node1,node2)
:#查詢兩個人的祖先是不是同乙個人
node1_ancestors=self.find_ancestors(node1)
node2_ancestors=self.find_ancestors(node2)
if node1_ancestors!=node2_ancestors:
#如果不是,那就合併兩個集合,從兩人中選舉乙個新祖先
self.node_relation_list[node1_ancestors]
=node2_ancestors
return
true
return
false
class
solution
:def
findcirclenum
(self, m: list[list[
int]])
->
int:
n=len(m)
dsu=dsu(n)
#n個節點數,初始化並查集
res=n#最開始假設有幾個節點就有幾個集合
for i in
range
(n):
for j in
range
(i+1
,n):
if m[i]
[j]==
1and dsu.merge_ancestors(i,j)
:#兩個節點是連通的,但是祖先並不是同乙個人,說明可以合併,集合數減一
res-=
1#否則兩個節點是連通的,且祖先是同乙個人,則集合數量並不需要改變
return res
python leetcode 5 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 這個題目解法很多,這裡選了,演算法邏輯清晰容易理解的中心擴散法。效率也算高的。遍歷字串,以字元為中心,...
python leetcode 最大回文數
直接暴力求解時間超出,選取manacher演算法 class solution def longestpalindrome self,s t join s 前後插入 是為了防止越界,不需要進行邊界判斷 n len t p 0 n 每一處的回文半徑 c r 0 r為當前訪問到的最右邊的值,c為此時對稱...
python LeetCode 奇偶鍊錶
給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 1 輸入 1 2 3 4 5 null ...