【LeetCode中等】二进制矩阵中的最短路径

news2024/9/29 7:28:04

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

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

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

示例 1:
在这里插入图片描述
输入:grid = [[0,1],[1,0]]
输出: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

可以说是广搜剪枝的超级典型的题目了,看题目要求是地图上寻找路径,下意识反应过来是搜索,再看题目要求,寻找所有路径中最短的,找一个用深搜找全部用广搜,所以直接套用八方向广搜的模板,题目的时间要求给的很宽松,不剪枝也能过。
在这里插入图片描述

class Solution {
public:
int dir[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
bool flag[105][105];
int n, ans = 99999;
int shortestPathBinaryMatrix(vector<vector<int> >& grid){
	n = grid[0].size();
	int sx, sy, ex, ey;
	sx = 0;
	sy = 0;
	ex = n - 1;
	ey = n - 1;
	if(grid[sx][sy]==1)
		return -1;	
	queue<pair<pair<int, int>, int> > q;
	q.push(make_pair(make_pair(sx, sy), 1));
	while(!q.empty()){
		pair<pair<int, int>, int> temp = q.front();
		q.pop();
		int nx = temp.first.first;
		int ny = temp.first.second;
		int cost = temp.second;
		if(nx==ex&&ny==ey){
			ans = min(ans, cost);
		}
		for(int i=0; i<8; i++){
		int tx = nx + dir[i][0];
		int ty = ny + dir[i][1];
		
		if(tx<0||ty<0||tx>=n||ty>=n)
			continue;
		if(flag[tx][ty]==true)
			continue;
		if(grid[tx][ty]==1)
			continue;
		flag[tx][ty] = 1;
		q.push(make_pair(make_pair(tx, ty), cost+1));
		}	
	}
	
	if(ans!=99999)
		return ans;
	else
		return -1;
}
};

在此基础上在加入剪枝的内容,也就是在遍历过程中,如果当前节点的路径长度已经超过了目前最优值,那么就没有沿这个节点继续搜索下去的必要,对这个节点就不需要继续处理。剪枝后时间复杂度能够有提升。
在这里插入图片描述

class Solution {
public:
int dir[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
bool flag[105][105];
int n, ans = 99999;
int shortestPathBinaryMatrix(vector<vector<int> >& grid){
	n = grid[0].size();
	int sx, sy, ex, ey;
	sx = 0;
	sy = 0;
	ex = n - 1;
	ey = n - 1;
	if(grid[sx][sy]==1)
		return -1;	
	queue<pair<pair<int, int>, int> > q;
	q.push(make_pair(make_pair(sx, sy), 1));
	while(!q.empty()){
		pair<pair<int, int>, int> temp = q.front();
		q.pop();
		int nx = temp.first.first;
		int ny = temp.first.second;
		int cost = temp.second;
		if(cost>ans)
			continue;

		if(nx==ex&&ny==ey){
			ans = min(ans, cost);
		}
		for(int i=0; i<8; i++){
		int tx = nx + dir[i][0];
		int ty = ny + dir[i][1];
		
		if(tx<0||ty<0||tx>=n||ty>=n)
			continue;
		if(flag[tx][ty]==true)
			continue;
		if(grid[tx][ty]==1)
			continue;
		flag[tx][ty] = 1;
		q.push(make_pair(make_pair(tx, ty), cost+1));
		}	
	}
	
	if(ans!=99999)
		return ans;
	else
		return -1;
}
};

关于空间复杂度,也可以优化pair的写法,用单独一个变量来存储到当前节点的距离,这样就不需要在pair中额外添加存储量,按道理空间复杂度还可以提升。

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

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

相关文章

在TP6.0引入Bootstrap4分页样式

1. TP6.0 默认分页 默认分页驱动类文件 vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php 默认分页代码 <ul class"pagination"> <li><a href"?page1">&laquo;</a></li> <li><a hre…

​Win10更新清理怎么做?

“我有一台华硕二合一笔记本电脑&#xff0c;发现它开始运行缓慢。有时&#xff0c;屏幕会卡在加载界面上&#xff0c;不得不重新启动。为了让电脑更加流畅&#xff0c;我已经将其更新到Windows 10版本&#xff0c;现在希望通过Win10更新清理来进一步提升性能。请问如何进行Win…

电脑重装win11系统好还是win10好

随着Windows 11的发布&#xff0c;许多用户开始思考&#xff0c;是应该升级到Windows 11还是继续使用Windows 10&#xff1f;本文将为您比较Windows 11和Windows 10的优势与劣势&#xff0c;帮助您选择适合自己的操作系统。 工具/原料&#xff1a; 系统版本&#xff1a;window…

Windows Copilot,来了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 5 月 23 日&#xff0c;微软 2023 Build 开发者大会正式开幕&#xff0c;跟 Google I/O 和 Apple WWDC 一样&#xff0c;每年微软都会在 Build 大会上发布各种新产品。 由于最近几个月 Cha…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

软考网工计算题总结(一):总共33类题型,进来复习啦!

题型一&#xff1a; 1.地址编号从80000H到BFFFFH且按字节编址的内存容量为&#xff08;5&#xff09;KB,若用16KX4bit的存储芯片够成该内存&#xff0c;共需&#xff08;6&#xff09;片。 (5)A.128 B.256 C.512 D.1024 (6)A.8 B.16 C.32 D.64 【答案】B C 【解析】本题…

springboot入门简单使用

springboot入门简单使用 1、SpringBoot项目创建并配置mysql数据库创建项目编写Controller测试配置数据库 2、SpringBoot集成mybatis-plus初始化数据库安装mybatis-plus通过mybatis-plus将数据库数据通过接口显示 3、SpringBoot三层架构Controller、Service、Dao4、SpringBoot集…

【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

自动化测试技术相结合的测试方法

自动化测试技术相结合的测试方法 随着软件开发的不断进步和变革&#xff0c;测试也越来越重要。为了提高测试效率和质量&#xff0c;自动化测试技术相结合的测试方法得到了广泛应用。 自动化测试是一种利用工具和脚本自动执行测试任务的测试方法。通过自动化测试&#xff0c;可…

【产品设计】工具类产品,带一些社交元素

工具类产品要加入社交元素&#xff0c;关键在于找到工具与社交的结合点。 一、工具类的产品&#xff0c;可以这样加入社交元素 1、分开来看&#xff1a;工具类产品和社交类产品 工具类产品&#xff0c;顾名思义&#xff0c;以工具属性为主&#xff0c;核心突出的是一个“用”…

UE5.1.1C++从0开始(11.AI与行为树)

怕有些朋友不知道教程指的是哪一个&#xff0c;我在这里把教程的网址贴出来&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ?p1 这一章开始进入电脑玩家逻辑的编写&#xff0c;因为是第一次接触&#xff0c;所以老师也没有讲什么很难的问题&#xff0c;这里还是老样…

React学习笔记七-事件处理

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第七篇&#xff0c;主要介绍react中的事件处理。 事件处理 &#xff08;1&#xff09;通过onXxx属性指定事件处理函数&#xff08;注意大小写&#xff09; 1.react使用的是自定义(合…

01_JVM快速入门

从面试开始&#xff1a; 请谈谈你对JVM 的理解&#xff1f;java8 的虚拟机有什么更新&#xff1f; 什么是OOM &#xff1f;什么是StackOverflowError&#xff1f;有哪些方法分析&#xff1f; JVM 的常用参数调优你知道哪些&#xff1f; 内存快照抓取和MAT分析DUMP文件知道吗…

2023年第十五届电工杯选题浅析

本次电工杯作为2023年上半年度数学建模赛事的收官之战&#xff0c;报名队伍最后截止统计已经达到12000支队伍&#xff0c;同时免费的报名费也让这个收官之战&#xff0c;被很多建模小白当作第一次练手赛。为了帮助大家选题&#xff0c;下面为大家带来AB两题的思路浅析&#xff…

凌恩生物文献分享 | 癌症领域新曙光——肿瘤内微生物

上一期我们给大家介绍了肿瘤胞内菌在癌症转移中发挥的作用。2022年12月&#xff0c;蔡尚老师团队在Cell子刊-Trends in Cell Biology上又发表了一篇总结肿瘤内菌群在癌症转移中最新发现的综述&#xff0c;其中讨论了癌症治疗遇到的新挑战。 研究亮点 1&#xff09;癌症转移是…

Leetcode 1679. K 和数对的最大数目 双指针法

https://leetcode.cn/problems/max-number-of-k-sum-pairs/ 给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 示例 1&#xff1a; 输入&#xff1…

【JS】1693- 重学 JavaScript API - Web Storage API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API ❞ 在 Web 开发中经常需要在客户端保存和获取数据&#xff0c;Web Storage API 提供了一种在浏览器中存储…

【sop】含储能及sop的多时段配网优化模型

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型&#xff0c;链接含sop的配电网优化,很多同学在咨询如何增加储能约束&#xff0c;并进行多时段的优化&#xff0c;本次拓展该部分功能&#xff0c;在原代码的基础上增加储能模…

Paragon NTFS2023最新mac免费实用工具磁盘工具

mac虽然系统稳定&#xff0c;但在使用过程中也有一些瑕疵&#xff0c;如当mac连接到ntfs格式移动磁盘时&#xff0c;可能会出现移动磁盘无法在mac被正常读写的状况。遇到移动磁盘无法正常读写的状况&#xff0c;我们可以在mac中使用磁盘工具&#xff0c;以使mac获得对ntfs格式移…

Docker实战1-运行前端Vue项目

本次运行了两个项目&#xff0c;一个是开源的镜像&#xff0c;一个是自己的前端项目镜像 1 在docker中运行 keycloak docker run -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin quay.io/keycloak/keycloak:21.1.1 start-dev 这个最简单了&#xff0c…