LeetCode第11天 (二)huawei 测试题 并查集

以下题目来源力扣
547. 省份数量
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

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

        for i in range(cities):
            if i not in visited:
                dfs(i)
                provinces += 1
        return provinces

200. 岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m=len(grid)
        n=len(grid[0])
        # visited=set()
        def dfs(grid,i,j):
            grid[i][j] = 0
            for (x,y) in ((i-1,j),(i,j-1),(i+1,j),(i,j+1)):
                if m>x>=0 and n>y>=0 and grid[x][y]=="1":
                    dfs(grid,x,y)
        


        if m == 0:
            return 0
        island=0
        for i in range(m):
            for j in range(n):
                if  grid[i][j]=="1" :
                    island=island+1
                    dfs(grid,i,j)
                    
        return island

684. 冗余连接
树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。

可以通过并查集寻找附加的边。初始时,每个节点都属于不同的连通分量。遍历每一条边,判断这条边连接的两个顶点是否属于相同的连通分量。

class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        n=len(edges)
        parents=[i for i in range(0,n+1)]
        
        def find(node):
            if parents[node]!=node:
                parents[node]=find(parents[node])
            return parents[node]

        def union(node1,node2):
            parents[find(node1)]=find(node2)
        
        for node1,node2 in edges:
            if find(node1)!=find(node2):
                union(node1,node2)
            else:
                return [node1,node2]
        return []

你可能感兴趣的:(Leetcode,leetcode,深度优先,算法)