// Union Find solution // great solution public int NumIslands2(char[][] grid) { var m = grid.Length; var n = grid[0].Length; var totalLength = m * n; var uf = new UnionFind(totalLength + 1); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] == '1') { if (j + 1 < n && grid[i][j + 1] == '1') { uf.Union(i * n + j, i * n + j + 1); } if (i + 1 < m && grid[i + 1][j] == '1') { uf.Union(i * n + j, (i + 1) * n + j); } } else { uf.Union(i * n + j, totalLength); } } } return(uf.Count() - 1); }
// 261. Graph Valid Tree // Ridiculously easy with UnionFind public bool ValidTree(int n, int[][] edges) { var uf = new UnionFind(n); foreach (var e in edges) { if (uf.Connected(e[0], e[1])) { return(false); } uf.Union(e[0], e[1]); } return(uf.Count() == 1); }