Пример #1
0
        // 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);
        }
Пример #2
0
        // 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);
        }