【1月打卡~Leetcode每日一题】547. 省份数量(难度:中等)

547. 省份数量

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。

方法一:DFS

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        n,ans = len(isConnected),0
        visited = set()
        
        def dfs(i):
            visited.add(i)
            for j in range(n):
                if isConnected[i][j]==1 and j not in visited:
                    dfs(j)

        for i in range(n):
            if i not in visited:
                ans += 1
                dfs(i)
        return ans

时间复杂度O(n²)
空间复杂度O(n)

方法二:并查集(模版建议背下来)
find函数:找某个数所在宗族的族地,union函数:将index1的族地改成index2的族地,最后返回当前数即自己族地的数量,即连通域个数

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        n = len(isConnected)
        parent = list(range(n))

        def find(index):
            if parent[index] != index:
                parent[index] = find(parent[index])
            return parent[index]

        def union(index1,index2):
            parent[find(index1)] = find(index2)

        for i in range(n):
            for j in range(i):
                if isConnected[i][j]:
                    union(i,j)
        return sum(parent[i]==i for i in range(n))

你可能感兴趣的:(并查集,python,算法,数据结构,机器学习)