【算法题解】200. 岛屿数量 - Java - dfs、bfs、并集法

题目描述

力扣200

Java代码
  1. DFS
    思路:依次遍历网格;将坐标位置值是 ‘1’ (陆地)的当前位置及其上下左右位置“同化”为 ‘0’ 或其他字符;若当前位置时’0’则退出dfs递归
    // DFS
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) return 0;

        int row = grid.length;
        int col = grid[0].length;
        int result = 0;
        // 遍历网格
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == '1') {
                    // 每次找到一个岛屿则返回结果加一
                    result++;
                    // dfs递归
                    dfs(grid, i, j, row, col);
                }
            }
        }
        // 返回结果
        return result;
    }
    // DFS 参数: grid网格,x和y是当前位置的坐标,row和col是网格的长宽
    public void dfs(char[][] grid, int x, int y, int row, int col) {
        // x y 坐标不在网格中或者当前位置不是岛屿则退出
        if (x < 0 || y < 0 || x >= row || y >= col || grid[x][y] == '0') return;
        // 将当前坐标“同化”,
        grid[x][y] = '0';

        // 递归当前坐标的上下左右四个位置是否是陆地,是的话就递归“同化”为0
        // 递归找当前坐标的右边一个
        dfs(grid, x + 1, y, row, col);
        // 递归找当前坐标的左边一个
        dfs(grid, x - 1, y, row, col);     
        // 递归找当前坐标的下边一个   
        dfs(grid, x, y + 1, row, col);     
        // 递归找当前坐标的上边一个   
        dfs(grid, x, y - 1, row, col);
    }
  1. BFS
   // BFS
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) return 0;

        int row = grid.length;
        int col = grid[0].length;
        int result = 0;
        // 遍历网格
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == '1') {
                    result++;
                    bfs(grid, i, j);
                }
            }
        }
        return result;
    }
    public void bfs(char[][] grid, int x, int y) {
        Queue<int[]> q = new LinkedList<>(); 
        // 每次都入队
        q.add(new int[] {x, y});
        // 每次都把队列清空
        while (!q.isEmpty()) {
            int[] cur = q.poll();
            x = cur[0];
            y = cur[1];
            // 满足的条件
            if (0 <= x && x < grid.length && 0 <= y && y < grid[0].length && grid[x][y] == '1') {
                grid[x][y] = '0';
                // 加入上下左右
                q.add(new int[] {x - 1, y});            
                q.add(new int[] {x + 1, y});            
                q.add(new int[] {x, y - 1});           
                q.add(new int[] {x, y + 1});     
            }
            
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值