2024-05-09 13:28阅读: 9评论: 0推荐: 0

[LeetCode] 最短的桥 双BFS Java

Problem: 934. 最短的桥

思路

先找到第一个岛屿,根据每一个岛屿的岛屿块的位置
多源查找这个块与第二个岛屿的距离,先找到的就是最少的距离
同时,将已遍历过的岛屿标记为-1,避免重复入队

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n^2)$

空间复杂度:

添加空间复杂度, 示例: $O(n^2)$

Code

class Solution {
    public int shortestBridge(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] dir = new int[][]{{-1,0}, {1, 0}, {0, -1}, {0, 1}};
        List<int[]> firstIsland = new ArrayList<>();
        Queue<int[]> queue = new LinkedList<>();
        // 找到第一个岛屿
        // -1 标记已经遍历过
        loop:for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(grid[i][j] == 1){
                    queue.offer(new int[]{i, j});
                    grid[i][j] = -1;
                    break loop;
                }
            }
        }
        while(!queue.isEmpty()){
            int[] point = queue.poll();
            firstIsland.add(point);
            for (int i = 0; i < 4; i++) {
                int x = point[0] + dir[i][0];
                int y = point[1] + dir[i][1];
                if(x>=0&& x<m && y>=0 && y<n && grid[x][y] == 1){
                    queue.offer(new int[]{x, y});
                    grid[x][y] = -1;
                }
            }
        }
        // 把找到的岛屿块入队
        for(int[] island : firstIsland){
            queue.offer(island);
        }
        // 查找第二个岛屿
        int step = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] point = queue.poll();
                for (int k = 0; k < 4; k++) {
                    int x = point[0] + dir[k][0];
                    int y = point[1] + dir[k][1];
                    if(x>=0&& x<m && y>=0 && y<n){
                        if(grid[x][y] == 0) {
                            queue.offer(new int[]{x, y});
                            grid[x][y] = -1;
                        }else if (grid[x][y] == 1){
                            return step;
                        }
                    }
                }
            }
            step++;
        }
        return 0;
    }
}

本文作者:XFS小风

本文链接:https://www.cnblogs.com/xiaofengs/p/18181972

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XFS小风  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作词 : Marc-André Brunelle

作曲 : Marc-André Brunelle

La fanfare frémit au carrefour de ta forme

Martellant sa poésie diforme

C'est l'eau de vie dans la sève, la conscience qui s'achève

Témoin de ta vision, auditeur de ta prison

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Alors viens jouer dehors

Je te gribouillerai des cartes comme un grand explorateur

Pour les moments ou tu t'écartes, que ça te fasse moins peur

Ça t'empêche de rire, ça t'impose le pire

Témoin de ta vision, auditeur de ta prison

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Alors viens jouer dehors