赞
踩
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
输入
[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
输出
3
// 思路1 public class Solution { void dfs(char[][] grid, int r, int c) { int len = grid.length; int len1 = grid[0].length; if (r < 0 || c < 0 || r >= len || c >= len1 || grid[r][c] == '0') { return; } grid[r][c] = '0'; dfs(grid, r - 1, c); dfs(grid, r + 1, c); dfs(grid, r, c - 1); dfs(grid, r, c + 1); } public int numIslandsByDFS(char[][] grid) { if (grid == null || grid.length == 0) { return 0; } int len = grid.length; int len1 = grid[0].length; int numIslands = 0; for (int r = 0; r < len; ++r) { for (int c = 0; c < len1; ++c) { if (grid[r][c] == '1') { ++numIslands; dfs(grid, r, c); } } } return numIslands; } }
时间复杂度分析:
O(MN):遍历二维数组
空间复杂度分析:
O(MN):这里的空间复杂度主要是针对递归的深度,最坏的情况下,二维数组都是1,则需要一直递归完整个二维数组
// 思路2 public class Solution { public int numIslandsByBFS(char[][] grid) { if (grid == null || grid.length == 0) { return 0; } int len = grid.length; int len1 = grid[0].length; int numIslands = 0; for (int r = 0; r < len; ++r) { for (int c = 0; c < len1; ++c) { if (grid[r][c] == '1') { ++numIslands; grid[r][c] = '0'; Queue<Integer> neighbors = new LinkedList<>(); neighbors.add(r * len1 + c); while (!neighbors.isEmpty()) { int id = neighbors.remove(); int row = id / len1; int col = id % len1; if (row - 1 >= 0 && grid[row - 1][col] == '1') { neighbors.add((row - 1) * len1 + col); grid[row - 1][col] = '0'; } if (row + 1 < len && grid[row + 1][col] == '1') { neighbors.add((row + 1) * len1 + col); grid[row + 1][col] = '0'; } if (col - 1 >= 0 && grid[row][col - 1] == '1') { neighbors.add(row * len1 + col - 1); grid[row][col - 1] = '0'; } if (col + 1 < len1 && grid[row][col + 1] == '1') { neighbors.add(row * len1 + col + 1); grid[row][col + 1] = '0'; } } } } } return numIslands; } }
时间复杂度分析:
O(MN):遍历二维数组
空间复杂度分析:
O(min(M,N)):在最坏情况下,整个网格均为陆地,队列的大小可以达到 min(M,N)。
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。