说明
算法:Number of Islands
LeetCode地址:https://leetcode.com/problems/number-of-islands/
题目:
Given a 2d grid map of '1’s (land) and '0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
11000
11000
00100
00011
Output: 3
解题思路
问题类型:图的深度优先搜索算法。
求岛屿的个数,实际为上下左右连通的图的个数。题目给出了数目条件为’1’, 实际还有一个隐含条件,就是连在一起的’1’,表示已经被访问过。
标志为新岛屿的充分必要条件就变成了 grid[row][column] == '1' && visitArray[row][column] == false
时间复杂度为 O(rowcolumn) , 标志是否已经访问过得子方法 markConnectIsland
,时间复杂度为O(rowcolumn), 也就是均摊为每个数据都访问一次,也就是跟父方法 numIslands
时间复杂度一样。
代码实现
import java.util.Arrays;
public class NumberOfIslands {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int count = 0;
int rowLen = grid.length;
int columnLen = grid[0].length;
boolean[][] visitArray = new boolean[rowLen][columnLen];
for (int row = 0; row < rowLen; row++) {
for (int column = 0; column < columnLen; column++) {
if (grid[row][column] == '1' && visitArray[row][column] == false) {
markConnectIsland(grid, visitArray, row, column);
count++;
}
}
}
return count;
}
private void markConnectIsland(char[][] grid, boolean[][] visitArray, int row, int column) {
if (row < 0 || row >= grid.length) return;
if (column < 0 || column >= grid[0].length) return;
if (grid[row][column] != '1' || visitArray[row][column]) return;
visitArray[row][column] = true;
markConnectIsland(grid, visitArray, row + 1, column);
markConnectIsland(grid, visitArray, row - 1, column);
markConnectIsland(grid, visitArray, row, column + 1);
markConnectIsland(grid, visitArray, row, column - 1);
}
public static void main(String[] args) {
//char[][] grid = {
// {'1', '1', '1', '1', '0'},
// {'1', '1', '0', '1', '0'},
// {'1', '1', '0', '0', '0'},
// {'0', '0', '0', '0', '0'}
// };
char[][] grid = {
{'1', '1', '0', '0', '0'},
{'1', '1', '0', '0', '0'},
{'0', '0', '1', '0', '0'},
{'0', '0', '0', '1', '1'}
};
int count = new NumberOfIslands().numIslands(grid);
System.out.println("input: " + Arrays.toString(grid) + "\nOutput:" + count );
}
}
运行结果
input: [[C@610455d6, [C@511d50c0, [C@60e53b93, [C@5e2de80c]
Output:3
代码执行效率
Runtime: 5 ms, faster than 37.70% of Java online submissions for Number of Islands.
Memory Usage: 39.9 MB, less than 78.00% of Java online submissions for Number of Islands.
总结
图的深度优先搜索。