【1091. 二进制矩阵中的最短路径】

这篇具有很好参考价值的文章主要介绍了【1091. 二进制矩阵中的最短路径】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来源:力扣(LeetCode)

描述:

给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1

二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:

  • 路径途经的所有单元格都的值都是 0
  • 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。

畅通路径的长度 是该路径途经的单元格总数。

示例 1:

【1091. 二进制矩阵中的最短路径】

输入:grid = [[0,1],[1,0]]
输出:2

示例 2:
【1091. 二进制矩阵中的最短路径】

输入:grid = [[0,0,0],[1,1,0],[1,1,0]]
输出:4

示例 3:

输入:grid = [[1,0,0],[1,1,0],[1,1,0]]
输出:-1

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 为 0 或 1

方法:广度优先搜索

把单元格当成图的节点,如果两个相邻单元格的值都是 0,那么这两个相邻单元格代表的节点之间存在边,且边长为 1。因此问题可以转化为给定一个无权图,求两个节点的最短路径。求无权图的最短路径问题的解法是广度优先搜索。

首先如果 grid[0][0] = 1,那么显然不存在最短路径,因此返回 −1。使用 dist 保存某一单元格到左上角单元格的最短路径,初始时 dist[0][0] = 0。初始时,我们将单元格 (0, 0) 放入队列中,然后不断执行以下操作:

  1. 如果队列为空,那么返回 −1。
  2. 从队列中取出单元格 (x, y),如果该单元格等于右上角单元格,那么返回 dist[x][y]。
  3. 遍历该单元格的所有相邻单元格,如果相邻单元格 (x1, y1) 的值为 0 且未被访问,那么令 dist[x1][y1] = dist[x][y] + 1,并且将相邻单元格 (x1, y1) 放入队列中。

代码:

class Solution {
public:
    int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
        if (grid[0][0] == 1) {
            return -1;
        }
        int n = grid.size();
        vector<vector<int>> dist(n, vector<int>(n, INT_MAX));
        queue<pair<int, int>> q;
        q.push({0, 0});
        dist[0][0] = 1;
        while (!q.empty()) {
            auto [x, y] = q.front();
            q.pop();
            if (x == n - 1 && y == n - 1) {
                return dist[x][y];
            }
            for (int dx = -1; dx <= 1; dx++) {
                for (int dy = -1; dy <= 1; dy++) {
                    if (x + dx < 0 || x + dx >= n || y + dy < 0 || y + dy >= n) { // 越界
                        continue;
                    }
                    if (grid[x + dx][y + dy] == 1 || dist[x + dx][y + dy] <= dist[x][y] + 1) { // 单元格值不为 0 或已被访问
                        continue;
                    }
                    dist[x + dx][y + dy] = dist[x][y] + 1;
                    q.push({x + dx, y + dy});
                }
            }
        }
        return -1;
    }
};

执行用时:56 ms, 在所有 C++ 提交中击败了50.27%的用户
内存消耗:20.2 MB, 在所有 C++ 提交中击败了32.54%的用户
复杂度分析
时间复杂度:O(n2),其中 n 是数组的行数或列数。广度优先搜索最多访问 n2 个单元格。
空间复杂度:O(n2)。队列 q 不超过 n2 个元素,保存 dist 需要 O(n2) 的空间,保存队列 q 需要 O(n2) 的空间。
author:LeetCode-Solution文章来源地址https://www.toymoban.com/news/detail-474538.html

到了这里,关于【1091. 二进制矩阵中的最短路径】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 1253. 重构 2 行二进制矩阵

    力扣题目链接:https://leetcode.cn/problems/reconstruct-a-2-row-binary-matrix/ 给你一个  2  行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第 0 行的元素之和为  upper 。 第 1 行的元素之和为 lower 。 第 i 列(从 0 开始编号)的元素之和为

    2024年02月11日
    浏览(26)
  • 【每日一题】1253. 重构 2 行二进制矩阵

    给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为 upper。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    浏览(27)
  • ​LeetCode解法汇总253. 重构 2 行二进制矩阵

    https://github.com/September26/java-algorithms 给你一个  2  行  n  列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第  0  行的元素之和为  upper 。 第  1  行的元素之和为  lower 。 第  i  列(从  0  开始编号)的元素之和为  colsum[i] ,

    2024年02月11日
    浏览(28)
  • Qt中的 tableView 设置 二进制 十六进制 序号表头

    因为QTableView的垂直表头并不支持使用委托来自定义。 相反,可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码: 在这个示例中,自定义了BinaryHeaderView类,继承自QHeaderView, 重写了paintSection方法来绘制二进制序列。然后,将这个自定义的垂直表头应用到了

    2024年04月27日
    浏览(29)
  • JS中的常见二进制数据格式

    格式 描述 用途 示例 ArrayBuffer 固定长度的二进制数据缓冲区,不直接操作具体的数据,而是通过类型数组或DataView对象来读写 用于存储和处理大量的二进制数据,如文件、图像等 let buffer = new ArrayBuffer(16); TypedArray 基于ArrayBuffer对象的视图,提供特定格式的读写接口 用于操作

    2024年04月11日
    浏览(32)
  • 【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵

    给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为 upper。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    浏览(39)
  • 改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

    目录  ​ 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 配电系统中存在大量的分段开关和联络开关,配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标,使其达到最优状态。正常运行时,则通过两类开关的不同组合状态

    2024年02月15日
    浏览(35)
  • 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    原题链接 本题我们先需要知道 十进制 如何转 二进制 二进制 如何转 十进制 十进制 如何转 二进制: 十进制转成二进制 例如 173 转成 二进制 就把173 短除法 除到0 然后 得到的余数, 从下往上写 二进制 转成 十进制 利用如图方法,把二进制 转成 十进制 本题是高精度,如何

    2023年04月26日
    浏览(35)
  • 将数据转二进制流文件,用PostMan发送二进制流请求

    一、将byte数组转二进制流文件,并保存到本地 byte [] oneshotBytes=new byte[]{78,-29,51,-125,86,-105,56,82,-94,-115,-22,-105,0,-45,-48,-114,27,13,38,45,-24,-15,-13,46,88,-90,-66,-29,52,-23,40,-2,116,2,-115,17,36,15,-84,88,-72,22,-86,41,-90,-19,-58,19,99,-4,-63,29,51,-69,117,-120,121,3,-103,-75,44,64,-58,-34,73,-22,110,-90,92,-35,-18,-128,16,-

    2024年02月15日
    浏览(29)
  • 2023-05-11:给你一个 m x n 的二进制矩阵 grid, 每个格子要么为 0 (空)要么为 1 (被占据), 给你邮票的尺寸为 stampHeight x stampWidth。 我们想将

    2023-05-11:给你一个 m x n 的二进制矩阵 grid, 每个格子要么为 0 (空)要么为 1 (被占据), 给你邮票的尺寸为 stampHeight x stampWidth。 我们想将邮票贴进二进制矩阵中,且满足以下 限制 和 要求 : 覆盖所有空格子,不覆盖任何被占据的格子, 可以放入任意数目的邮票,邮票

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包