力扣 1020. 飞地的数量

题目:

 

分析:

        如果他能跨越边界,首先需要一个与边界相邻的1,否则没法进行,于是我们可以开始的时候遍历每个节点,把为1的边界结点记录下来放入队列,并修改1的值(便于与未遍历到的1区分),然后记录不为1的非边界结点的数量sum,然后在队列中取出每个一边界节点,判断其上下左右是否有未遍历到的1,有则总数sum减1,并将该节点放入队列,直到队列为空,此时sum的值为我们要求的值。

代码:

class Solution {
    public int numEnclaves(int[][] grid) {
        Queue<Integer> q=new LinkedList<Integer>();
        int sum=0;
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j]==1){
                    if(i==0||j==0||i+1==grid.length||j+1==grid[0].length){
                        grid[i][j]=2;
                        q.offer(i);
                        q.offer(j);
                    }else{
                        sum++;
                    }
                }
            }
        }
        while(!q.isEmpty()){
            int x=q.poll();
            int y=q.poll();
            sum=aaa(grid,x+1,y,q,sum);
            sum=aaa(grid,x-1,y,q,sum);
            sum=aaa(grid,x,y+1,q,sum);
            sum=aaa(grid,x,y-1,q,sum);
        }
        return sum;
    }

    public int aaa(int[][] grid,int x,int y,Queue<Integer> q,int sum){
        if(x<0||y<0||x>=grid.length||y>=grid[0].length){
            return sum;
        }else{
            if(grid[x][y]==1){
                grid[x][y]=2;
                q.offer(x);
                q.offer(y);
                return sum-1;
            }
            return sum;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值