题解 | #岛屿数量#

岛屿数量

https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e

import java.util.*;


public class Solution {
    /**
     * 判断岛屿数量
     * @param grid char字符型二维数组
     * @return int整型
     */
    public int solve (char[][] grid) {
        // write code here
        int  m = grid.length;
        int  n = grid[0].length;

        //记录岛屿数量
        int count = 0 ;
        for (int i = 0 ; i < m ; i++) {
            for (int j = 0 ; j < n ; j++) {
                //判断当前位置字符是否为1
                //如果是1
                if (grid[i][j] == '1') {

                    count++;
                    //方法1: dfs 一条路走到黑 把所有能到达的坐标如果是1都变成0

                    //dfs(grid,i,j);
                    //方法2: bfs 从被选中的点开始扩散 把该点周边的1都变成0

                    bfs(grid, i, j);
                }
            }
        }

        return count;
    }
    void dfs(char[][] grid, int i, int j) {
        //dfs 结束条件 当数组越界时 或者 到达 '0' 时 终止遍历
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length ||
                grid[i][j] == '0')
            return;
        //将当前遍历到的'1' 变为 '0'
        grid[i][j] = '0';
        //向上遍历
        dfs(grid, i - 1, j);
        //向下遍历
        dfs(grid, i + 1, j);
        //向左遍历
        dfs(grid, i, j - 1);
        //向右遍历
        dfs(grid, i, j + 1);

    }

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

        int len = grid[0].length;
        
        //将当前遍历到的'1' 变为 '0'
        grid[i][j] = '0';
        //与dfs一条路走到底不同 bfs 是要把周边能到达的点都要变成 '0'
        Queue<Integer> queue = new LinkedList<>();
        //由于 队列中只能存储一种数据 而 地址信息由两位 因此使用code转换
        int code = i * len + j;
        queue.add(code);
        while(!queue.isEmpty()){
            //取出队首数据 
            int index = queue.poll();
            
            int x = index/len;
            int y = index%len;

            if(x > 0 && x <= grid.length -1 && grid[x-1][y] == '1')
            {
                 grid[x-1][y] = '0';
                queue.add((x-1)*len+y);
            }
            if(x >= 0 && x < grid.length -1 && grid[x+1][y] == '1')
            {
                grid[x+1][y] = '0';
                queue.add((x+1)*len+y);
            }
            if(y > 0 && y <= len -1 && grid[x][y-1] == '1')
            {
                grid[x][y-1] = '0';
                queue.add(x*len+y-1);
            }
            if(y >= 0 && y < len-1 && grid[x][y+1] == '1')
            {
                grid[x][y+1] = '0';
                queue.add(x*len+y+1);
            }
        }

    }
}

全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务