算法奇妙屋(十六)-BFS解决边权为1的多源最短路径问题

文章目录

整体算法解析

一. 力扣 542. 01 矩阵

1. 题目解析

2. 算法原理

这里细节与之前的单源问题稍有不同, 但基本上一模一样, 这里直接看图即可

3. 代码

java 复制代码
    public int[][] updateMatrix(int[][] mat) {
        int[] dx = { 1, -1, 0, 0 };
        int[] dy = { 0, 0, 1, -1 };
        int m = mat.length;
        int n = mat[0].length;
        int[][] dist = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        // 初始化, 加入队列
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (mat[i][j] == 0) {
                    dist[i][j] = 0;
                    q.offer(new int[] { i, j });
                } else {
                    dist[i][j] = -1;
                }
            }
        }
        // 扩展
        while (!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
                    q.offer(new int[] { x, y });
                    dist[x][y] = dist[a][b] + 1;
                }
            }
        }
        return dist;
    }

二. 力扣 1020. 飞地的数量

1. 题目解析

2. 算法原理

这里的算法原理也是十分简单, 正难则反的思想一定要注意, 遇到想不到解法的题不妨换个角度

3. 代码

java 复制代码
    public int numEnclaves(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        boolean[][] vis = new boolean[m][n];
        Queue<int[]> q = new LinkedList<>();
        // 初始化队列和标记
        for (int i = 0; i < m; i++) {
            if (grid[i][0] == 1) {
                q.offer(new int[]{i, 0});
                vis[i][0] = true;
            }
            if (grid[i][n - 1] == 1) {
                q.offer(new int[]{i, n - 1});
                vis[i][n - 1] = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (grid[0][j] == 1) {
                q.offer(new int[]{0, j});
                vis[0][j] = true;
            }
            if (grid[m - 1][j] == 1) {
                q.offer(new int[]{m - 1, j});
                vis[m - 1][j] = true;
            }
        }
        while(!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1) {
                    q.offer(new int[]{x, y});
                    vis[x][y] = true;
                }
            }
        }
        int ret = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && !vis[i][j]) {
                    ret++;
                }
            }
        }
        return ret;
    }

三. 力扣 1765. 地图中的最高点

1. 题目解析

这道题和之前的题十分类似, 就是题意理解起来有点困难, 但是理解完题意之后这道题的解法就出来了

2. 算法原理

因为和矩阵那道题解法一模一样, 所以这里我就直接将上面的题解复制下来, 并解释为何如此

3. 代码

java 复制代码
    public int[][] highestPeak(int[][] isWater) {
        int[] dx = { 0, 0, 1, -1 };
        int[] dy = { 1, -1, 0, 0 };
        int m = isWater.length;
        int n = isWater[0].length;
        int[][] ret = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ret[i][j] = -1;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (isWater[i][j] == 1) {
                    q.offer(new int[] { i, j });
                    ret[i][j] = 0;
                }
            }
        }
        while (!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && ret[x][y] == -1) {
                    q.offer(new int[] { x, y });
                    ret[x][y] = ret[a][b] + 1;
                }
            }
        }
        return ret;
    }

四. 力扣 1162. 地图分析

1. 题目解析

2. 算法原理


3. 代码

java 复制代码
    public int maxDistance(int[][] grid) {
        int[] dx = { 0, 0, 1, -1 };
        int[] dy = { 1, -1, 0, 0 };
        int m = grid.length;
        int n = grid[0].length;
        int[][] dist = new int[m][n];
        Queue<int[]> q = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dist[i][j] = -1;
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    dist[i][j] = 0;
                    q.offer(new int[]{i, j});
                }
            }
        }
        int ret = -1;
        while(!q.isEmpty()) {
            int[] t = q.poll();
            int a = t[0];
            int b = t[1];
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i];
                int y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
                    q.offer(new int[]{x, y});
                    dist[x][y] = dist[a][b] + 1;
                    ret = Math.max(dist[x][y], ret);
                }
            }
        }
        return ret;
    }
相关推荐
地平线开发者12 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮13 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者13 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考13 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx17 小时前
CART决策树基本原理
算法·机器学习
Wect17 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱18 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway1 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风1 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect1 天前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript