def numIslands(grid): #获取行数和列数 nrow = len(grid) if nrow == 0: return 0 ncol = len(grid[0]) if ncol == 0: return 0 #所有1的坐标 lands = set() for i in range(nrow): for j in range(ncol): if grid[i][j] == "1": lands.add((i, j)) #初始化不相交集 ds = DisjointSet(list(lands)) #扫描所有可能相邻的1,不断地union for point in lands: h_adj_point = (point[0], point[1] + 1) #右邻居 v_adj_point = (point[0] + 1, point[1]) #下邻居 #如果1的右邻居和下邻居都是1,则进行Union if h_adj_point in lands: ds.Union(point, h_adj_point) if v_adj_point in lands: ds.Union(point, v_adj_point) #最终返回不相交集的数目 return ds.SetCnt
def solve(board): if board: #如果board为空则不做任何处理 nrow, ncol = len(board), len(board[0]) inner, border = [], [] #记录所有"O"出现的位置,分为内部和边界处 #扫描,记录所有"O'的位置 for i in range(nrow): for j in range(ncol): if board[i][j] == "O": if i == 0 or i == nrow - 1 or j == 0 or j == ncol - 1: border.append((i, j)) else: inner.append((i, j)) #如果边界上无O,则全部转换 if not border: for loc in inner: board[loc[0]][loc[1]] = "X" else: #初始化不相交集 ds = DisjointSet(border + inner) #将边界上的"O"点Union起来 pivot = border[0] for loc in border[1:]: ds.Union(pivot, loc) #遍历inner和border,建立必要的连接 for loc in border + inner: if loc[0] < nrow - 1: if board[loc[0] + 1][loc[1]] == "O": ds.Union(loc, (loc[0] + 1, loc[1])) if loc[1] < ncol - 1: if board[loc[0]][loc[1] + 1] == "O": ds.Union(loc, (loc[0], loc[1] + 1)) #遍历inner中的点,若其不与border中的点同类,则转换 for loc in inner: if ds.Find(loc) != ds.Find(pivot): board[loc[0]][loc[1]] = "X"
def findRedundantConnection(edges): n = len(edges) #点的数目 ds = DisjointSet(range(1, n + 1)) #初始化不相交集,下标从1开始 PrevSetCnt = ds.SetCnt #上一步的不相交集数目 for edge in edges: ds.Union(edge[0], edge[1]) if PrevSetCnt == ds.SetCnt: #当加入一条边时不相交集的数目没有发生改变,则说明该边是多余的,形成了一个环 return edge PrevSetCnt = ds.SetCnt
def findCircleNum(M): n = len(M) if n == 0: return 0 #初始化不相交集 DS = DisjointSet(range(n)) #扫描M矩阵,完成Union操作 for i in range(n): for j in range(i): if M[i][j] == 1: DS.Union(i, j) #返回不相交集的数目 return DS.SetCnt