694 number of distinct islands

https://leetcode.com/problems/number-of-distinct-islands/

主要是如何encode island,如果island一样,dfs遍历这个岛的顺序也是一样的,我这里是选择的用相对于出发点的偏移量来encode,同时注意如果这道题in place修改成0来作为visited会简单一点

class Solution {
    private static int[][] DIR = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    private Set<String> islands = new HashSet<>();
    public int numDistinctIslands(int[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    StringBuilder path = new StringBuilder();
                    dfs(grid, i, j, path, new int[]{i, j});
                    islands.add(path.toString());
                }
            }
        }
        return islands.size();
    }
    private void dfs(int[][] grid, int i, int j, StringBuilder path, int[] start) {
        if (!isValid(grid, i, j)) return;
        grid[i][j] = 0;
        
        path.append((i - start[0]) + " " + (j - start[1]));
        for (int[] dir : DIR) {
            dfs(grid, i+dir[0], j+dir[1], path, start);
        }
    }
    private boolean isValid(int[][] grid, int i, int j) {
        int m = grid.length;
        int n = grid[0].length;
        
        if (i >= 0 && i < m && j >= 0 && j < n) {
            return grid[i][j] == 1;
        }
        return false;
    }
}

Last updated