【LeetCode】岛屿数量

1.题目

题目:给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:
11110
11010
11000
00000

输出: 1
示例 2:输入:
11000
11000
00100
00011

输出: 3

2.解题思路

  • 遍历所有的节点,利用DFS的方式将其周围的1全部赋值为0, 如果是0直接跳过(如果不跳过会把整个图都赋值为0一遍)

3.代码实现

3.1 递归实现
class Solution {
    public int numIslands(char[][] grid) {
        // int row = grid.length;
        // int col = grid[0].length;   IndexOutOfBoundException
        int res = 0;
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == '1'){
                    res++;
                    dfs(grid, i , j);
                }
            }
        }
        return res;
    }
    
    public void dfs(char[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length) 
            return;
        if (grid[i][j] == '0')
            return;
        grid[i][j] = '0';
        dfs(grid, i + 1 , j);
        dfs(grid, i , j + 1);
        dfs(grid, i - 1 , j);
        dfs(grid, i , j - 1);
    }
}

3.2非递归实现

class Solution {
    public int numIslands(char[][] grid) {
        // int row = grid.length;
        // int col = grid[0].length;   IndexOutOfBoundException
        int res = 0;
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == '1'){
                    res++;
                    dfs(grid, i , j);
                }
            }
        }
        return res;
    }
    
    // recursion
    // public void dfs(char[][] grid, int i, int j) {
    //     if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length) 
    //         return;
    //     if (grid[i][j] == '0')
    //         return;
    //     grid[i][j] = '0';
    //     dfs(grid, i + 1 , j);
    //     dfs(grid, i , j + 1);
    //     dfs(grid, i - 1 , j);
    //     dfs(grid, i , j - 1);
    // }
    
    //non-recursion
    
    class IndexNode {
        int i;
        int j;
        public IndexNode(int i, int j) {
            this.i = i;
            this.j = j;
        }
    }
    public void dfs(char[][] grid, int i, int j) {
        Queue<IndexNode> queue = new LinkedList<>();
        queue.add(new IndexNode(i, j));
        IndexNode temp = null;
        while(!queue.isEmpty()) {
            temp = queue.poll();
            if (temp.i < 0 || temp.j < 0 || temp.i >= grid.length || temp.j >= grid[i].length) 
                continue;
            if (grid[temp.i][temp.j] == '0')
                continue;

            grid[temp.i][temp.j] = '0';
            queue.add(new IndexNode(temp.i + 1 , temp.j));
            queue.add(new IndexNode(temp.i , temp.j + 1));
            queue.add(new IndexNode(temp.i - 1 , temp.j));
            queue.add(new IndexNode(i , temp.j - 1));
        }

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值