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

news2025/7/15 22:03:18

来源:力扣(LeetCode)

描述:

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

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

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

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

示例 1:

1

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

示例 2:
2

输入: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【参考设计】16芯串联电池包储能系统

电池包的应用与技术问题 为了获得更大的能量密度&#xff0c;锂离子和磷酸铁锂电池在电池包中的使用越来越多&#xff0c;比如&#xff1a;电信机房的UPS单元&#xff0c;移动式电站&#xff0c;储能系统等。 锂离子和磷酸铁锂电池在提供更高的功率和能量密度的同时也需要更准…

Android深入源码分析事件分发机制流程

前言 对于Android中的触摸事件即指手指触摸到屏幕时产生的点击事件&#xff1b; 类型如下&#xff1a; MotionEvent.ACTION_DOWNMotionEvent.ACTION_UPMotionEvent.ACTION_MOVEMotionEvent.ACTION_CANCEL Android事件处理流程 主要涉及三个流程&#xff1a;事件采集、事件中…

电子水尺的应用

品概述 本产品是一种采用微处理器芯片为控制器&#xff0c;内置通讯电路的数字式水位传感器&#xff0c;具备高的可靠性及抗干扰性能。适用于江、河、湖、水库及蓄水池、水渠等处的水位测量使用。 本产品使用不锈钢材料做壳体防护材料&#xff0c;内部用高性能的密封材料进行处…

11省政企单位密集调研实在智能数字员工

当前&#xff0c;数字中国建设迎来前所未有的发展机遇。五月&#xff0c;“数字中国”建设持续如火如荼&#xff0c;实在智能又迎来了新的“考察团路线”&#xff1a;西部新宁甘云中轴线晋豫鄂湘东部鲁苏闽&#xff0c;来自11省&#xff0c;20余个“数字化改革政企考察团”&…

【OS】Python模拟简单的操作系统

【OS】Python模拟简单的操作系统 Background 学习操作系统的时候&#xff0c;关注的对象是&#xff1a; 应用程序系统调用操作系统的内部实现 通常的学习思路&#xff1a; 真实的操作系统编译内核环境qemu模拟 但是&#xff0c;换个角度想一下&#xff0c;把上述的思路抽…

智能蓝牙防丢器

蓝牙防丢器&#xff0c;是采用蓝牙技术专门为智能手机设计的防丢器。其工作原理主要是通过距离变化来判断物品是否还控制在你的安全范围。主要适用于手机、钱包、钥匙、行李等贵重物品的防丢&#xff0c;也可用于防止儿童或宠物的走失。防丢器的原理是在手机和蓝牙之间建立连接…

Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...

干货&#xff01;文章有点长&#xff0c;建议先收藏 目录索引 引言一、性能怪兽-Nginx概念深入浅出二、Nginx环境搭建三、Nginx反向代理-负载均衡四、Nginx动静分离五、Nginx资源压缩六、Nginx缓冲区七、Nginx缓存机制八、Nginx实现IP黑白名单九、Nginx跨域配置十、Nginx防盗链…

黑客必会的10个渗透测试工具

10个渗透测试工具&#xff0c;渗透测试&#xff0c;在之前&#xff0c;黑客攻击是很难的&#xff0c;需要大量的手工操作。然而&#xff0c;今天一套完整的自动化测试工具将黑客变成了半机械人&#xff0c;和以往相比&#xff0c;他们可以进行更多的测试。下面是一些渗透测试工…

Android Jetpack Compose之列表的使用

目录 概述实例解析1.实现简单的列表2.实现可滑动的菜单列表3.实现一个可滑动并且能快速滑动到指定位置的列表 总结 概述 在Android的传统View中&#xff0c;当我们需要展示大量的数据时&#xff0c;一般都会使用ListView或者是更高级的RecyclerView。在Compose中我们可以通过C…

openGauss Developer Day 2023 | 邀您参加南大通用分论坛

聚数成峰 共赢未来 面向数据库开发者的年度技术盛会 openGauss Developer Day 2023 将于5月25-26日在北京召开 GBASE南大通用将携创新数据库产品及行业解决方案亮相本届大会。 5月26日 &#xff0c;更设有南大通用 “多模多态分布式数据库助力数字化转型” 专场论坛&am…

SSM 如何使用 XA 机制实现分布式事务?

SSM 如何使用 XA 机制实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 XA 机制是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 XA 机制来管理分布式事务。本文将介绍如何在 SSM 框架中使用 XA 机制实现分布…

Find My产品|苹果上架支持Find My功能的旅行保温杯

苹果美国官网近日上架了 Ember 的控温 Travel Mug 2 旅行杯&#xff0c;售价为 199.95 美元。该旅行杯最大的亮点就是支持“Find My”&#xff0c;丢失后可在 iPhone&#xff0c;iPad 和 Mac 上定位找回。 Travel Mug 2 旅行杯和此前推出的 Travel Mug 2 旅行杯在功能方面完全相…

统计软件与数据分析Lesson15----梯度下降(Gradient Descent)过程可视化

梯度下降 Gradient Descent 1.预备知识1.1 什么是机器学习&#xff1f;1.2 几个专业术语 2. 前期准备2.1 加载包2.2 定义模型2.3 生成模拟数据2.4 分割训练集验证集2.5 原始数据可视化 3. 模型训练Step 0: 随机初始化待估参数Step 1: 计算模型预测值Step 2: 计算预测误差&#…

ORB-LSAM2:ComputeKeyPointsOctTree()提取特征:maxY = iniY + hCell + 6 为怎么是+6而不是+3?

如标题所示&#xff0c;本博客主要讲述 void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint>> &allKeypoints){}函数中maxY iniY hCell 6 为怎么是6而不是3&#xff1f; 为了连续性&#xff0c;会介绍一下ComputeKeyPointsOctTree函数&a…

【Git】git仓库的 .git 下各个目录注释

解释&#xff1a; .git 目录是Git版本控制系统的核心&#xff0c;它包含了Git所需要的所有信息&#xff0c;包括版本历史、分支、标签、配置等。下面是一些常见的 .git 目录下的文件和目录的说明&#xff1a; HEAD&#xff1a;指向当前分支的最新提交。config&#xff1a;包含…

告别重复工作,用Python实现办公自动化,提高工作效率

996 一直是互联网老生常谈的话题了&#xff0c;但抛开其他只谈工作本身&#xff0c;你有没有想过&#xff0c;下班晚、加班&#xff0c;有时候可能是因为自己工作比较低效&#xff1f; 先给你分享一个案例&#xff1a; 场景是在维护日活超过 3 亿用户的微博私信平台&#xff…

GIT合并分支的三种方法

一、使用merge命令合并分支 1、目标&#xff1a;将dev分支合并到master分支 1.1、首先切换到master分支上 git checkout master1.2、如果是多人开发的话 需要把远程master上的代码pull下来 git pull origin master //如果是自己一个开发就没有必要了&#xff0c;为了保险期…

ospf的rip和ospf互通以及配置stub区域和totally stub

1. ospf与rip如何互通 我们需要在两台路由器上互相引入,如上图 AR5和AR6运行了rip,但AR5也运行了ospf要想路由器能够互相学习到路由,就需要在AR5上配置路由协议引入 什么是stub区域如何配置stub区域 Stub区域的功能&#xff1a;过滤4类LSA和5类LSA&#xff0c;对外产生缺省的…

新星计划2023【网络应用领域基础】-------------Day2

计算机网络基础讲解 目录 计算机网络基础讲解​编辑​编辑 前言&#xff1a; 一&#xff0c;OSI参考模型​编辑 在说osi模型之前我先说说一些常见的标准机构&#xff1a; 这里对应用层一个小科普​编辑 二&#xff0c;TCP/IP协议​编辑 TCP/IP和OSI模型的主要区别在哪里&…

openGauss Developer Day 2023 | 邀您参加云和恩墨分论坛

5月25-26日&#xff0c; openGauss Developer Day 2023 将于 北京昆泰嘉瑞文化中心 举办&#xff0c;云和恩墨将携三款数据库创新产品亮相本次大会&#xff0c;并将在 26日下午 于 2F时代厅2厅 举办主题为“ 耕获菑畬&#xff0c;继往开来 ”的数据库技术创…