547 省份數量

2021-10-14 05:40:47 字數 3633 閱讀 6136

有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那麼城市 a 與城市 c 間接相連。

省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。

給你乙個 n x n 的矩陣 isconnected ,其中 isconnected[i][j] = 1 表示第 i 個城市和第 j 個城市直接相連,而 isconnected[i][j] = 0 表示二者不直接相連。

返回矩陣中 省份 的數量。

可以將n個城市和他們之間的相連關係看成圖,城市為圖中節點,相連關係為圖的邊,給定矩陣isconnected為圖的鄰接矩陣,省份即為圖中的連通分量。

計算省份總數,等價於計算圖中的連通分量數。

class

solution

:def

findcirclenum

(self, isconnected: list[list[

int]])

->

int:

#定義深度優先搜尋函式

#若i,j間連通,則計數1

defdfs

(i:int):

for j in

range

(provinces)

:if isconnected[i]

[j]==

1and j not

in visited:

visited.add(j)

dfs(j)

provinces=

len(isconnected)

#返回矩陣行數

visited=

set(

)#visited為乙個空集合,表示已訪問過的城市集合

circles=

0#計數,計省份數

for i in

range

(provinces)

:if i not

in visited:

#若i不在已訪問的城市集合裡,則尋找和它相連的其它城市,即乙個連通分量

dfs(i)

#找到有關i的乙個連通分量後,無返回值

circles+=

1#找出乙個連通分量後,即找到乙個省份,省份數加1

return circles

複雜度分析

時間複雜度 o(n

2)

o(n^2)

o(n2

):n為城市數量,需要遍歷矩陣n中的每個元素

空間複雜度 o(n

)o(n)

o(n)

:n為城市數量,需要使用陣列visited記錄每個城市是否被訪問過,陣列長度為n,遞迴呼叫棧的深度不會超過n。

對於每個城市,如果該城市尚未被訪問過,則從該城市開始廣度優先搜尋,直到同乙個連通分量重的所有城市都被訪問到,即可得到乙個省份。

class

solution

:def

findcirclenum

(self, isconnected: list[list[

int]])

->

int:

provinces=

len(isconnected)

#返回矩陣行數

visited=

set(

)#定義乙個空集

circles=

0#計省份數

for i in

range

(provinces)

:if i not

in visited:

q=collections.deque(

[i])

#deque為雙邊隊表,可以從兩端新增元素

#找出所有與i相連的城市,即與i有關的連通分量

while q:

#q中每新增乙個元素,便遍歷一次while語句

j=q.popleft(

)#輸出隊表q中最左邊元素

visited.add(j)

for k in

range

(provinces)

:#找出與j相連的城市

if isconnected[j]

[k]==

1and k not

in visited:

#返回while語句,找出與k相連的城市

circles+=

1#找到乙個連通分量,即乙個省份

return circles

複雜度分析

時間複雜度 o(n

2)

o(n^2)

o(n2

):n為城市數量。需要遍歷矩陣isconnected中每個元素。

空間複雜度 o(n

)o(n)

o(n)

:n為城市數量,需要使用陣列visited記錄每個城市是否被訪問過,陣列長度是n,廣度優先搜尋使用的佇列的元素個數不會超過n。

初始時,每個城市都屬於不同的連通分量。遍歷矩陣 isconnected,如果兩個城市之間有相連關係,則它們屬於同乙個連通分量,對它們進行合併。遍歷矩陣 isconnected 的全部元素之後,計算連通分量的總數,即為省份的總數。

class

solution

:def

findcirclenum

(self, isconnected: list[list[

int]])

->

int:

#尋找根節點

deffind

(index:

int)

->

int:

if parent[index]

!=index:

#若index不是根節點

parent[index]

=find(parent[index]

)#找出parent[index]的根節點

return parent[index]

#返回index的根節點

#定義合併函式

defunion

(index1:

int,index2:

int)

: parent[find(index1)

]=find[index2]

#index1的根節點等於index2的根節點

provinces=

len(isconnected)

parent=

list

(range

(provinces)

)for i in

range

(provinces)

:for j in

range

(i+1

,provinces)

:#上三角矩陣

if isconnected[i]

[j]==1:

#若i,j間連通,則屬於同乙個連通分量

union(i,j)

circles=

sum(parent[i]==1

for i in

range

(provinces)

)#???

return circles

547 省份數量

有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那麼城市 a 與城市 c 間接相連。省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。給你乙個 n x n 的矩陣 isconnected 其中 isconnected...

547 省份數量

有n個城市,其中一些彼此相連,另一些沒有相連。如果城市a與城市b直接相連,且城市b與城市c直接相連,那麼城市a與城市c間接相連。省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。給你乙個n x n的矩陣isconnected,其中isconnected i j 1表示第i個城市和第j個城...

LeetCode 547 省份數量

題目鏈結 有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那麼城市 a 與城市 c 間接相連。省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。給你乙個 n x n 的矩陣 isconnected 其中 isconn...