算法奇妙屋(十六)-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;
    }
相关推荐
代码游侠10 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_7634724610 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy11 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异11 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_7066532311 小时前
分布式系统安全通信
开发语言·c++·算法
天天爱吃肉821812 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
alphaTao12 小时前
LeetCode 每日一题 2026/2/2-2026/2/8
算法·leetcode
甄心爱学习12 小时前
【leetcode】判断平衡二叉树
python·算法·leetcode
颜酱12 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
不知名XL12 小时前
day50 单调栈
数据结构·算法·leetcode