news 2026/4/16 14:28:31

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/4/16 14:26:21

Jenkins流水线配置的两种方式

在Jenkins的项目配置里面&#xff0c;如果创建的是流水线项目。在流水线配置的地方&#xff0c;有两种方式&#xff0c;如下图所示&#xff1a;方式一&#xff1a;pipiline script&#xff0c;直接在配置页面上写流水线脚本。方式二&#xff1a;pipeline script from SCM&#…

作者头像 李华
网站建设 2026/4/16 10:59:32

深度解析 CherryECAT:国产 EtherCAT 协议栈与国外主流方案的全方位对比及项目实战(上)

目录 工业以太网的 “顶流”:EtherCAT 协议基础认知 EtherCAT 核心原理与关键算法(新手也能懂) CherryECAT 与国外协议栈基础信息全景对比 核心技术原理与算法深度拆解 功能特性全方位对比 性能指标实测对比(含测试代码与数据) 代码实战:不同协议栈开发完整示例 应用场景…

作者头像 李华
网站建设 2026/4/16 12:39:36

统计今日、最近一周、最近一个月

结果 req请求参数 Data public class ReportDayWeekMonthReq {//1-day, 2-week, 3-monthprivate Integer flag;}service Overridepublic List<ReportDayWeekMonth> getReportDayWeekMonth(ReportDayWeekMonthReq req) {if (req.getFlag() null){throw new IllegalArg…

作者头像 李华
网站建设 2026/4/15 16:14:51

动态住宅IP:从基础概念到实操指南(开发者必备)

在爬虫开发、跨境业务运营、数据采集分析等场景中&#xff0c;动态住宅IP是解决IP封禁、地域限制的核心工具。但很多开发者在选型和使用过程中&#xff0c;常会遇到“IP被封”“连接失败”“速度卡顿”等问题。本文整理了动态住宅IP的高频核心问题&#xff0c;从基础概念到技术…

作者头像 李华
网站建设 2026/4/1 23:28:40

springboot大学生心理健康管理系统

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

作者头像 李华