1559. 二维网格图中探测环(并查集,dfs)

   方法一:记忆化dfs

class Solution {
    boolean[][] visited;
    public boolean containsCycle(char[][] grid) {
        int m = grid.length, n = grid[0].length;
        visited = new boolean[m][n];
        for(boolean[] v : visited) Arrays.fill(v,false);
        if(m < 2 || n < 2) return false;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(grid[i][j] == '.') continue;
                if(dfs(grid,i,j,m,n,grid[i][j],-1,-1)) return true;
            }
        }
        return false;
    }
    int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
    public boolean dfs(char[][] grid, int i, int j, int m, int n, char pre, int prex, int prey) {
        if(i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != pre) return false;
        if(visited[i][j]) return true;
        visited[i][j] = true;
        for(int k = 0; k < 4; k++) {
            if(i + dir[k][0] == prex && j + dir[k][1] == prey) continue;
            if(dfs(grid,i+dir[k][0],j+dir[k][1],m,n,pre,i,j)) return true;
        }
        visited[i][j] = false;
        grid[i][j] = '.';
        return false;
    }
}

  方法二:并查集

class Solution {
    int[] p;
    public boolean containsCycle(char[][] grid) {
        int m = grid.length, n = grid[0].length;
        p = new int[m*n];
        for(int i = 0; i < n * m; i++) {
            p[i] = i;
        }
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                char c = grid[i][j];
                if(i + 1 < m && grid[i+1][j] == c) {
                    if(union(i*n+j,(i+1)*n+j)) return true;
                }
                if(j + 1 < n && grid[i][j+1] == c) {
                    if(union(i*n+j,i*n+j+1)) return true;
                }
            }
        }
        return false;
    }
    public int find(int x) {
        if(x != p[x]) p[x] = find(p[x]);
        return p[x];
    }
    public boolean union(int a, int b) {
        int fa = find(a), fb = find(b);
        if(fa != fb) {
            p[fa] = fb;
            return false;
        }
        return true;
    }
}

 

posted @ 2020-08-27 17:42  Sexyomaru  阅读(167)  评论(0编辑  收藏  举报