算法奇妙屋(十六)-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;
    }
相关推荐
NAGNIP11 小时前
一文搞懂树模型与集成模型
算法·面试
NAGNIP11 小时前
万字长文!一文搞懂监督学习中的分类模型!
算法·面试
技术狂人16811 小时前
工业大模型工程化部署实战!4 卡 L40S 高可用集群(动态资源调度 + 监控告警 + 国产化适配)
人工智能·算法·面试·职场和发展·vllm
D_FW11 小时前
数据结构第六章:图
数据结构·算法
a程序小傲11 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
自学不成才12 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
June`12 小时前
全排列与子集算法精解
算法·leetcode·深度优先
徐先生 @_@|||12 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
夏鹏今天学习了吗13 小时前
【LeetCode热题100(78/100)】爬楼梯
算法·leetcode·职场和发展