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