python leetcode 547 省份數量

2021-10-14 11:06:39 字數 1597 閱讀 9364

簡單的修改一下原始的並查集,來判斷剩下的集合的數量

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 ...