每日一道Leetcode - 934. 最短的桥【广度遍历|深度遍历】

在这里插入图片描述
参考别人的做法,第一次碰到广度遍历/深度遍历的题目

class Solution {
    public int shortestBridge(int[][] A) {
        int R = A.length;
        int C = A[0].length;
        int[][] direction = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
        // 定义双端队列
        // 创建一个队列,保存的是访问到的格子坐标,是个二维数组
        Deque<int []> queue = new ArrayDeque<>();
        int ans = -1;
        boolean[][] visited = new boolean[R][C];
        boolean flag = true;
        // 找到1个1进行深度遍历,就结束循环
        for(int i=0;i<R && flag;i++){
            for(int j = 0;j<C;j++){
                if(A[i][j]==1){
                    dfs(A,i,j,queue,visited);
                    flag = false;
                    break;
                }
            }
        }
        // 当前队列不为空
        while(!queue.isEmpty()){
            // 队列的大小
            int size = queue.size();
            ans++;
            for(int i =0;i<size;i++){
                // 广度遍历,找到一个坐标发散
                int[] node = queue.poll();
                // 四个方向
                for(int j =0;j<4;j++){
                    int nx = node[0]+ direction[j][0];
                    int ny = node[1]+ direction[j][1];
                    if(nx<0||nx>=R||ny<0||ny>=C||visited[nx][ny]) continue;
                    // 发散到第二座岛屿的1了,可以联通两座岛屿
                    if(A[nx][ny] == 1) return ans;
                    visited[nx][ny] = true;
                    queue.add(new int[]{nx,ny});
                }
            }
        }
        return ans;
    }

    private void dfs(int[][] A,int i,int j,Deque queue, boolean[][] visited){
        int R = A.length;
        int C = A[0].length;
        // 边界条件
        if(i<0 || i>=R || j<0 || j>=C || visited[i][j] || A[i][j]!=1) return;
        //标注这个格子被访问过
        visited[i][j] = true;
        // add方法表示把坐标点(i,j)加入到队列的队尾
        queue.add(new int[]{i,j});
        dfs( A, i-1, j, queue, visited);
        dfs( A, i+1, j, queue, visited);
        dfs( A, i, j-1, queue, visited);
        dfs( A, i, j+1, queue, visited);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值