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

说明

算法: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.

总结

图的深度优先搜索。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值