news 2026/3/25 9:33:10

A.每日一题——1970. 你能穿过矩阵的最后一天

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
A.每日一题——1970. 你能穿过矩阵的最后一天

题目链接:1970. 你能穿过矩阵的最后一天(困难)

算法原理:

解法:深搜DFS

方法一:反向dfs

13ms击败94.50%

时间复杂度O(mn)

①初始时网格全是水,从最后一天往回推,每天把一个水单元格变成陆地

②检查新恢复的陆地能否从第一行连接到最后一行(上下左右四个方向检查),首次满足时即代表是正向最后一次能走通的路径,其天数即为答案

方法二:正向dfs

5ms击败100.00%

时间复杂度O(mn)

①初始时网格全是陆地,从第一天开始推,每天把一个陆地单元格变成水

②检查水单元格能否从最左列连接到最右列(八个方向检查),首次满足时即代表是所有路径都被封死的时候,其前一天即为答案

③细节:因为题目的day并非封死之后的天数,而是首次封死的触发天,而这一天恰好是最后能过河的天,所以返回的不是day-1

Java代码:

class Solution { //方法一:反向dfs int[] dx=new int[]{0,0,1,-1}; int[] dy=new int[]{1,-1,0,0}; int m,n; public int latestDayToCross(int _m, int _n, int[][] cells) { m=_m;n=_n; //0=水,1=已恢复但未验证连通性的陆地,2=已恢复且有连通性的陆地 byte[][] state=new byte[m][n]; //从最后一天开始逐步恢复陆地 for(int day=cells.length-1;;day--){ //获取第day天被淹没的单元格,正确映射下标 int[] cell=cells[day]; int r=cell[0]-1; int c=cell[1]-1; //将该单元格恢复为陆地,待验证连通性 state[r][c]=1; //核心判断:新恢复的陆地能否连通第一行和最后一行 if(dfsup(r,c,state)&&dfsdown(r,c,state)) return day; } } //判断能否连通第一行 private boolean dfsup(int r,int c,byte[][] state){ //如果当前单元格本身就在第一行,直接返回 if(r==0) return true; //遍历四个方向,看能否连通上 for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; //坐标合法+邻域能连通上 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==2) return true; } return false; } //判断能否连通最后一行 private boolean dfsdown(int r,int c,byte[][] state){ //本身就在最后一行,直接返回 if(r==m-1) return true; //标记当前单元格为能连通的单元格 state[r][c]=2; //遍历四个方向,递归检查连通性 for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; //保证坐标合法+邻域是待验证的陆地 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==1) //如果邻域能连接最后一行,则当前单元格也能 if(dfsdown(x,y,state)) return true; } return false; } }
class Solution { //方法二:正向dfs int[] dx=new int[]{0,0,1,-1,1,1,-1,-1}; int[] dy=new int[]{1,-1,0,0,1,-1,1,-1}; int m,n; public int latestDayToCross(int _m, int _n, int[][] cells) { m=_m;n=_n; //0=陆地,1=未连通的水,2=已连通的水 byte[][] state=new byte[m][n]; //从第一天开始连通水 for(int day=0;;day++){ //获取第day天被淹没的单元格,正确映射下标 int[] cell=cells[day]; int r=cell[0]-1; int c=cell[1]-1; //将该单元格用水淹没,待验证连通性 state[r][c]=1; //核心判断:新水能否连接最左列和最右列 if(dfsleft(r,c,state)&&dfsright(r,c,state)) return day; } } //判断能否连通最左列 private boolean dfsleft(int r,int c,byte[][] state){ //如果当前单元格本身就在最左列,直接返回 if(c==0) return true; //遍历八个方向,看能否连通上 for(int k=0;k<8;k++){ int x=r+dx[k],y=c+dy[k]; //坐标合法+邻域能连通上 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==2) return true; } return false; } //判断能否连通最右列 private boolean dfsright(int r,int c,byte[][] state){ //本身就在最后一行,直接返回 if(c==n-1) return true; //标记当前单元格为能连通的单元格 state[r][c]=2; //遍历八个方向,递归检查连通性 for(int k=0;k<8;k++){ int x=r+dx[k],y=c+dy[k]; //保证坐标合法+邻域是待验证的水 if(x>=0&&x<m&&y>=0&&y<n&&state[x][y]==1) //如果邻域能连接最右列,则当前单元格也能 if(dfsright(x,y,state)) return true; } return false; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 19:18:08

AI智能体在识别经济护城河中的作用

AI智能体在识别经济护城河中的作用 关键词:AI智能体、经济护城河、识别作用、数据分析、机器学习 摘要:本文深入探讨了AI智能体在识别经济护城河方面的作用。首先介绍了研究的背景,包括目的、预期读者、文档结构和相关术语。接着阐述了AI智能体和经济护城河的核心概念及其联…

作者头像 李华
网站建设 2026/3/19 21:31:38

Hadoop vs 数据仓库:大数据存储方案深度对比

Hadoop vs 数据仓库&#xff1a;大数据存储方案深度对比关键词&#xff1a;Hadoop、数据仓库、大数据存储、分布式计算、湖仓一体、结构化数据、非结构化数据摘要&#xff1a;在大数据时代&#xff0c;选择合适的存储方案是企业数据战略的关键。本文将Hadoop与传统数据仓库放在…

作者头像 李华
网站建设 2026/3/15 17:50:55

8款AI论文辅助软件功能测评:智能降重与高效写作能力评估

当前市场上AI论文辅助工具功能多样&#xff0c;实测数据显示&#xff0c;高效降重与降低AIGC检测率的核心需求可通过Grammarly、QuillBot等文本优化工具实现&#xff0c;而Paperpal、Writefull则擅长学术语言润色&#xff1b;Scite.ai凭借文献溯源功能脱颖而出&#xff0c;Hemi…

作者头像 李华
网站建设 2026/3/18 8:44:54

统信UOS操作系统无“网络”选项下连接wifi

如图&#xff0c;是我电脑的设置界面&#xff0c;其中没有“网络”选项&#xff0c;该如何连接wifi呢&#xff1f;方法是通过命令行的方式&#xff1a;1. 查看当前网络链接状态 nmcli connection show --active2. 查看可链接的无线网络 nmcli device wifi list3. 打开无线功能&…

作者头像 李华
网站建设 2026/3/15 3:40:10

springboot大学社团管理系统

文章目录具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万…

作者头像 李华