分享

算法:Number of Islands(岛屿的个数)

 jasonbetter 2019-08-23

本文链接:https://blog.csdn.net/zgpeace/article/details/88658439

说明

算法:Number of Islands
LeetCode地址:https:///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
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

Example 2:

Input:
11000
11000
00100
00011

Output: 3
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

解题思路

问题类型:图的深度优先搜索算法。
求岛屿的个数,实际为上下左右连通的图的个数。题目给出了数目条件为’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 );
    }}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

  • 44

  • 45

  • 46

  • 47

  • 48

  • 49

  • 50

  • 51

  • 52

  • 53

  • 54

  • 55

  • 56

运行结果

input: [[C@610455d6, [C@511d50c0, [C@60e53b93, [C@5e2de80c]Output:3
  • 1

  • 2

  • 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.

总结

图的深度优先搜索。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/popular/NumberOfIslands.java

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约