【Leetcode】200. Number of Islands
程序员文章站
2022-05-23 21:47:30
...
题目地址:
https://leetcode.com/problems/number-of-islands/
给定一个二维矩阵,只含和。连成一片可以看成一个岛屿。问一共多少个岛屿。可以设一个布尔visited数组,一旦在grid里找到了,就用DFS将和这个连成一片的位置都标记为true,并统计岛屿个数加一。遍历完grid后返回岛屿个数即可。代码如下:
public class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int m = grid.length, n = grid[0].length;
boolean[][] visited = new boolean[m][n];
// 表示搜索的四个方向
int[][] d = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 如果找到了一个新的没被访问过的岛屿的边界,就统计岛屿数量加一,并去拓展它
if (grid[i][j] == '1' && !visited[i][j]) {
res++;
dfs(grid, i, j, visited, d);
}
}
}
return res;
}
// 从(i, j)开始,搜索与(i, j)连成一片的岛屿,并全部标记为true,表示搜索过了
private void dfs(char[][] grid, int i, int j, boolean[][] visited, int[][] d) {
// 先标记(i, j)为true
visited[i][j] = true;
for (int k = 0; k < 4; k++) {
// 分别对四个方向进行DFS搜索,(x,y)表示下一层搜索的起点
int x = i + d[k][0];
int y = j + d[k][1];
// 如果下一步没出界,并且也是岛屿的一部分,并且没访问过(防止回头搜索),就进行下一层搜索
if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length
&& !visited[x][y] && grid[x][y] == '1') {
dfs(grid, x, y, visited, d);
}
}
}
}
时空复杂度。
下一篇: 自动装配和手工装配_我反对自动装配的情况
推荐阅读
-
leetcode 136 Single Number bit Option
-
[leetcode] 306. Additive Number 解题报告
-
LeetCode_#9_回文数 Palindrome Number_C++题解
-
【LeetCode】806. Number of Lines To Write String
-
Leetcode 1498. Number of Subsequences That Satisfy the Given Sum Condition (python)
-
LeetCode 1020. Number of Enclaves 解题报告(python)
-
Leetcode 1530. Number of Good Leaf Nodes Pairs (python)
-
Leetcode 200. Number of Islands (python+cpp)
-
LeetCode 1254. Number of Closed Islands解题报告(python)
-
【LeetCode】762. Prime Number of Set Bits in Binary Representation