以下题目来源力扣
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 []