Number of Islands

3 篇文章 0 订阅

题目

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:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer:3

思路

思路很简单,在访问一个是’1’的点之后,修改其为’2’或者别的字符,然后再看周围是否为’1’,这样所有判断之后,就会确定一个岛
之前想过是不是可以只判断下边和右边,这样会简化很多,但是发现自己想错了,比如这种情况:

111111
000100
010100
011100

如果只判断下边和右边,结果是2个岛,但其实是1个

代码

public class Main {

    static int NumOfIslands(char[][] grid){
        int count = 0;
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                if(grid[i][j] == '1'){
                    Search(grid , i, j);
                    count++;
                }
            }
        }
        return count;
    }

    static void Search(char[][] grid, int i, int j){

        // 超出边界或者不是 '1',直接返回
        if(i < 0 || i >= grid.length || j < 0 ||  j >= grid[0].length || grid[i][j] != '1')
            return;
        grid[i][j] = '2';
        Search(grid, i-1, j); // 上边
        Search(grid, i+1, j); // 下边
        Search(grid, i, j-1); // 左边
        Search(grid, i, j+1); // 右边
    }

    public static void main(String[] args) {
            char a[][] = {{'1','1','1','1','0'},
                    {'1','1','0','1','0'},
                    {'1','1','0','0','0'},
                    {'0','0','0','0','0'}};
            char b[][] = {{'1','1','0','0','0'},
                    {'1','1','0','0','0'},
                    {'0','0','1','0','0'},
                    {'0','0','0','1','1'}};
            char c[][] = {{'1','1','1','1','1','1'},
                    {'0','0','0','1','0','0'},
                    {'0','1','0','1','0','0'},
                    {'0','1','1','1','0','0'}};
            System.out.println(NumOfIslands(a));
            System.out.println(NumOfIslands(b));
            System.out.println(NumOfIslands(c));
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值