2617. 网格图中最少访问的格子数(困难)

news/发布时间2024/5/19 6:18:05

核心思想
比较直观的想法就是BFS,但是每次遍历能走的点(右走,下走)会超时
考虑用两个set数组,
TreeSet<Integer>[] R = new TreeSet[n]; TreeSet<Integer>[] C = new TreeSet[m];
R[i]表示第i行还剩下哪些列col没去过,那么遍历就变为了二分查找第一个比当前j大的col
col > j + grid[i][j]时break
TODO:iterator

public int minimumVisitedCells(int[][] grid) {// n 行 m 列int n = grid.length, m = grid[0].length;//存储步数int[][] f = new int[n][m];// 使用双重循环来填充二维数组for (int i = 0; i < n; i++) {Arrays.fill(f[i], -1);}TreeSet<Integer>[] R =  new TreeSet[n];TreeSet<Integer>[] C =  new TreeSet[m];for(int i = 0; i < n; i++)R[i] = new TreeSet<Integer>();for(int j = 0; j < m; j++)C[j] = new TreeSet<Integer>();for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(i + j > 0){R[i].add(j);C[j].add(i);}}}Queue<int[]> q = new ArrayDeque<>();q.offer(new int[]{0, 0});f[0][0] = 1;while(!q.isEmpty()){int[] tp = q.poll();int i = tp[0], j = tp[1];// 向右走 去R中找// 第一个大于j的数Integer ceil = R[i].ceiling(j);if(ceil != null){//最远距离int maxiCol = j + grid[i][j];Iterator<Integer> iterator = R[i].tailSet(ceil).iterator();while(iterator.hasNext()){int col = iterator.next();if (col > maxiCol)break;//记录步数f[i][col] = f[i][j] + 1;//推入队列q.offer(new int[]{i, col});//移出Setiterator.remove();C[col].remove(i);}}// 向下走 去C中// 第一个大于i的数ceil = C[j].ceiling(i);if(ceil != null){//最远距离int maxiRow = i + grid[i][j];Iterator<Integer> iterator = C[j].tailSet(ceil).iterator();while(iterator.hasNext()){int row = iterator.next();if(row > maxiRow)break;//记录步数f[row][j] = f[i][j] + 1;//推入队列q.offer(new int[]{row, j});//移出Setiterator.remove();R[row].remove(j);}}}return f[n-1][m-1];}

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

【Java】使用 Java 语言实现一个冒泡排序

【Java】使用 Java 语言实现一个冒泡排序【Java】使用 Java 语言实现一个冒泡排序 前言 上一篇文章已经学习了,如何使用IDE集成开发工具编写Java代码,并输出了一段Hello World的代码。本篇文章将通过IDE使用 Java 语言实现一个冒泡排序。 冒泡排序介绍 冒泡排序也是一种简单直…

nginx文件服务器搭建---小白篇

1、安装依赖、关闭防火墙 [root@localhost ~]# yum install wget gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel [root@localhost ~]# systemctl stop firewalld1 [root@localhost ~]# systemctl disable firewalld 2、创建nginx启动用户 注意:会在/hom…

如何保证MySQL和Redis数据一致性?

在高并发的业务场景中,因为MySQL数据库是操作磁盘效率比较低,因此大多数情况下数据库都是高并发系统的瓶颈。因为Redis操作数据是在内存中进行,所以就需要使用Redis做一个缓存。让请求先访问到Redis,而不是直接访问MySQL数据库。背景在高并发的业务场景中,因为MySQL数据库…

websocket在线测试

首先先在网页打开测试画面 http://www.jsons.cn/websocket/然后根据系统进行连接按照格式进行连接 连接参数用问好 记得跟token 和 需要的参数 中间用& 并且 值用等号这个是连接上的画面 根据系统 输入参数进行测试 输入参数 和 值 进行测试

eclipse、IDEA配置文档注释

Javadoc:文档注释常用参数常见注释类型 注释含义@author 类的作者@version 类的版本@param 方法的参数@return 方法的返回类型@exception 方法抛出的异常@see 另外参照……@since 从什么时候开始使用的@date 日期@time 时间最常用设置对象 类型(Types)注释标签(类的注释) 方…

[Python]知识点

这篇文章是关于Python各类知识点的小结,包括:特殊标识符、特殊方法、list等。望对大家有帮助! 如果文中阐述不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18031984 出自【进步*于辰的…