694. Number of Distinct Islands
11000
11000
00011
0001111011
10000
00001
1101111
1 1
11Last updated
Was this helpful?
11000
11000
00011
0001111011
10000
00001
1101111
1 1
11Last updated
Was this helpful?
Was this helpful?
class Solution {
private static final int d [] = {0,1,0,-1,0};
public int numDistinctIslands(int[][] grid){
int m = grid.length, n = grid[0].length;
Set<List<List<Integer>>> distinctIslands = new HashSet<>();
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j++){
List<List<Integer>> island = new ArrayList<>();
if (dfs(i, j, i, j, grid, m, n, island)){
distinctIslands.add(island);
}
}
}
return distinctIslands.size();
}
private boolean dfs(int i, int j, int x, int y, int[][] grid, int m, int n, List<List<Integer>> island ){
if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] <= 0) return false; // 1: island, -: visited path
grid[x][y] = -1;
island.add(Arrays.asList(x - i, y - j));
for( int k = 0; k < 4; k ++){
dfs(i, j, x + d[k], y + d[k + 1], grid, m, n, island);
}
return true;
}
}class Solution {
public:
int numDistinctIslands(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
set<vector<vector<int>>> distinctIslands;
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j++){
vector<vector<int>> island;
if (dfs(i, j, i, j, grid, m, n, island)){
distinctIslands.insert(island);
}
}
}
return distinctIslands.size();
}
private:
int d [5] = {0,1,0,-1,0};
bool dfs(int i, int j, int x, int y, vector<vector<int>> & grid, int m, int n, vector<vector<int>> & island){
if(x < 0 or x >= m or y < 0 or y >= n or grid[x][y] <= 0) return false;
grid[x][y] *= -1;
island.emplace_back(x-i, y-j);
for(int k = 0; k < 4; k++){
dfs(i, j, x + d[k], y + d[k + 1], grid, m, n, island);
}
return true;
}
};