不同岛屿的数量 II
难度:
标签:
题目描述
代码结果
运行时间: 130 ms, 内存: 17.9 MB
/*
题目: 不同岛屿的数量 II
思路:
1. 使用深度优先搜索(DFS)遍历网格中的每一个陆地单元格,标记访问过的单元格。
2. 在DFS过程中记录每个岛屿的形状。
3. 将每个岛屿的形状存储到一个集合中,以避免重复。
4. 集合的大小即为不同岛屿的数量。
5. 使用Java Stream API来处理集合操作。
*/
import java.util.HashSet;
import java.util.Set;
import java.util.stream.IntStream;
public class NumberOfDistinctIslandsStream {
public int numDistinctIslands(int[][] grid) {
Set<String> uniqueIslands = new HashSet<>();
int rows = grid.length;
int cols = grid[0].length;
boolean[][] visited = new boolean[rows][cols];
IntStream.range(0, rows).forEach(i ->
IntStream.range(0, cols).forEach(j -> {
if (grid[i][j] == 1 && !visited[i][j]) {
StringBuilder shape = new StringBuilder();
dfs(grid, visited, i, j, shape, 'O');
uniqueIslands.add(shape.toString());
}
})
);
return uniqueIslands.size();
}
private void dfs(int[][] grid, boolean[][] visited, int i, int j, StringBuilder shape, char direction) {
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0 || visited[i][j]) {
return;
}
visited[i][j] = true;
shape.append(direction);
dfs(grid, visited, i - 1, j, shape, 'U');
dfs(grid, visited, i + 1, j, shape, 'D');
dfs(grid, visited, i, j - 1, shape, 'L');
dfs(grid, visited, i, j + 1, shape, 'R');
shape.append('B');
}
}
解释
方法:
这个题解的思路是先用 DFS 或 BFS 找出每个岛屿的形状,并将岛屿的形状表示为相对于左上角的坐标偏移量。然后对每个形状进行 8 种变换(旋转和翻转),将变换后的形状进行比较,去除重复的岛屿形状,最终得到不同岛屿的数量。
时间复杂度:
O(mn * log(mn))
空间复杂度:
O(mn)
代码细节讲解
🦆
题解中提到的每个岛屿形状进行8种变换的具体方法是什么,能否详细解释这些变换如何实现?
▷🦆
如何确保在进行岛屿形状变换后,能够正确地比较并去除重复的岛屿形状?
▷🦆
在将岛屿形状添加到集合前,为什么需要对形状的坐标进行排序?这样做的目的是什么?
▷🦆
为什么选择使用集合(set)来存储岛屿的形状,而不是使用列表(list)或其他数据结构?
▷