题目描述:
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
示例1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
示例2:
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
本题和leetcode 200求岛屿数量是非常类似的,解法也是类似的。
思路:
可以采用深搜、广搜、并查集。
采用并查集的代码:
class Solution(object):
def findCircleNum(self, isConnected):
"""
:type isConnected: List[List[int]]
:rtype: int
"""
if not isConnected or not isConnected[0]:
return 0
uf = UnionFind(isConnected)
h = len(isConnected)
for i in range(h):
for j in range(h):
if isConnected[i][j] == 1 and i != j:
uf.union(i, j)
count = 0
for l in range(h):
if uf.parent[l] == l:
count += 1
return count
class UnionFind(object):
def __init__(self, grid):
m = len(grid)
self.parent = [i for i in range(m)]
self.rank = [0] * m
def find(self, i):
while i != self.parent[i]:
i = self.parent[i]
return i
def union(self, x, y):
rootx = self.find(x)
rooty = self.find(y)
if rootx != rooty:
if self.rank[rootx] < self.rank[rooty]:
self.parent[rootx] = rooty
elif self.rank[rootx] > self.rank[rooty]:
self.parent[rooty] = rootx
else:
self.parent[rooty] = rootx
self.rank[rootx] += 1