本文共 1628 字,大约阅读时间需要 5 分钟。
题目要求我们计算给定二维网格中的岛屿数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。网格的四个边均被水包围。
为了高效地解决这个问题,我们可以使用深度优先搜索(DFS)算法。DFS 适合这种网格问题,因为它可以通过递归来访问所有相邻的点。
步骤如下:
visited
,记录哪些点已经被访问过。public class numIslands { public int numIslands(char[][] grid) { if (grid.length == 0) { return 0; } int row = grid.length; int col = grid[0].length; boolean[][] visited = new boolean[row][col]; int count = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (grid[i][j] == '1' && !visited[i][j]) { count++; dfs(grid, visited, row, col, i, j); } } } return count; } private void dfs(char[][] grid, boolean[][] visited, int row, int col, int i, int j) { if (i < 0 || j < 0 || i >= row || j >= col) { return; } if (grid[i][j] == '0') { return; } if (visited[i][j]) { return; } visited[i][j] = true; dfs(grid, visited, row, col, i - 1, j); dfs(grid, visited, row, col, i + 1, j); dfs(grid, visited, row, col, i, j - 1); dfs(grid, visited, row, col, i, j + 1); }}
numIslands
函数首先检查网格是否为空,如果为空,直接返回0。visited
和计数器 count
。dfs
函数进行深度优先搜索。dfs
函数检查当前点是否越界、是否是水或者是否已被访问,如果是,则标记为已访问,并递归访问相邻的四个方向。count
加1。转载地址:http://mpwa.baihongyu.com/