L200 岛屿数量

L200 岛屿数量

使用dfs和bfs的目的,找一个值为‘1’的元素后,寻找其所有的邻居,并将其值置为0,然后计数。
核心:寻找邻居,然后进行相应操作(在这里是将值置为0)

不同的是,深度优先使用递归
广度优先使用栈

dfs

class Solution {
    public int numIslands(char[][] grid) {
        //初始化岛屿的数量
        int count = 0;
        //遍历二维数组
        for(int i=0;i<grid.length;i++){
            for(int j = 0;j<grid[0].length;j++){
                //遇到元素为1的值就调用dfs,数量+1
                if(grid[i][j] == '1'){
                    dfs(grid,i,j);
                    count++;
                }
            }
        }
        return count;

    }
    //dfs搜索
    //i,j 越界,或者不是岛屿就直接返回,否则先把值赋值为0,然后递归,
    private void dfs(char[][] grid,int i,int j){
        if(i<0 || j<0 || i>=grid.length || j >= grid[0].length || 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);

        
    }
}

bfs

class Solution {
    public int numIslands(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'){
                   bfs(grid,i,j);
                   count++;
               }
           }
       }
       return count;

    }
    //bfs广度优先
    //定义一个栈,将为1的元素放入栈中,将值为1的元素置为0 ,并将1元素的上下左右邻居放入栈中,
    private void bfs(char[][] grid,int i,int j){
        //定义一个栈,
        Queue<int[]> stack = new LinkedList<>();
        //将元素加入栈
        stack.add(new int[]{i,j});
        //只要当前栈不为空,
        while(!stack.isEmpty()){
            int[] cur = stack.remove();
             i = cur[0];
             j = cur[1];
            if(i>=0 && i<grid.length && j>=0 && j<grid[0].length &&grid[i][j] =='1' ){
                grid[i][j] = '0';
                stack.add(new int[]{i+1,j});
                stack.add(new int[]{i-1,j});
                stack.add(new int[]{i,j+1});
                stack.add(new int[]{i,j-1});
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值