每日一题:最大加号标志

在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1mines[i] = [xi, yi]表示 grid[xi][yi] == 0

返回  grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0 。

一个 k 阶由 1 组成的 “轴对称”加号标志 具有中心网格 grid[r][c] == 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1 。

示例 1:

输入: n = 5, mines = [[4, 2]]
输出: 2
解释: 在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。

示例 2:

输入: n = 1, mines = [[0, 0]]
输出: 0
解释: 没有加号标志,返回 0 。

提示:

  • 1 <= n <= 500
  • 1 <= mines.length <= 5000
  • 0 <= xi, yi < n
  • 每一对 (xi, yi) 都 不重复​​​​​​​

最简单的思路就是暴力遍历,对每个各自向上、向下、向左、向右延伸,记录下各自能到达的最远距离,然后取最小值就是能构成的最大加号。

在这个过程中,是否有一些可以利用到的信息?去减少遍历的次数?

以向右延伸为例,grid[0][0]向右延伸的最大值取决于其本身的值(是否为0),和grid[0][1]向右延伸的最大值,即在向右的这个维度上:

grid[i][j] = \left\{\begin{matrix} 0& ,grid[i][j] = 0 & \\ grid[i][j+1] + 1& ,grid[i][j] !=0 & \end{matrix}\right.

到这里显然就是用到动态规划的思路。

总共有4个维度,上下左右,所以考虑设计一种遍历方式,可以高效率的同时计算出各个维度上的结果,我们考虑利用矩阵的对称性,如下图所示(可以先下去看代码回头再看图解):

i,j为常规遍历时的当前格子,正常需要从i,j向四个方向延伸。

这里多定义了一个变量k,它从末尾开始递减,它的作用是:随着j的增加,k是减少的,如果将j的增加描述为向右延伸,那么k的减少就是向左延伸

同时,由于矩阵对称性(i,j和j,i关于对角线),i,j描述向右延伸,那么j,i就能描述向下延伸。(这里由于是方阵,所以不用考虑越界问题)

按照这种遍历方式,移动一次(注意箭头方向描述延伸方向):

 移动两次,此时j = k,但是描述的方向不同:

移动第三次,这里的格子和第一次移动一样,但是延伸方向相反:

移动第四次,对i = 0的情况遍历完成:

 在这个过程中我们得到了什么?

对于[0][0]这个格子,我们得到了四个方向的延伸值,而对于其他经过的格子,有的得到了左右延伸的值(第一行),有的得到了上下延伸的值(第一列)。

接下来对i加1,重复这个过程,注意箭头方向和上面的不同,看到这里对于第一行,我们将给他补上纵向也就是上下方向的延伸结果:

 当所有i遍历完成,我们就得到了dp矩阵,而结果就是dp矩阵的最大值。

完整代码:

class Solution {
public:int orderOfLargestPlusSign(int n, vector<vector<int>>& mines) {vector<vector<int>> dp(n,vector<int>(n,n));int result = 0;for(auto& item : mines){dp[item[0]][item[1]] = 0;}for(int i = 0;i < n;++i){int left = 0;int right = 0;int up = 0;int down = 0;for(int j = 0,k = n-1;j < n;++j,--k){left = dp[i][j] == 0 ? 0 : left + 1;right = dp[i][k] == 0 ? 0 : right + 1;up = dp[j][i] == 0 ? 0 : up + 1;down = dp[k][i] == 0 ? 0 : down + 1;dp[i][j] = min(dp[i][j],left);dp[i][k] = min(dp[i][k],right);dp[j][i] = min(dp[j][i],up);dp[k][i] = min(dp[k][i],down);}}for(auto& item : dp){result = max(result,*max_element(item.begin(),item.end()));}return result;}
};

 针对上面的代码:

  1. vector<vector<int>> dp(n,vector<int>(n,n));这里将每个值初始化为n,原因是后续要取最小值,并且最长的加号长度也就是n。
  2. max_element(item.begin(),item.end())将返回指向最大值的迭代器,*max_element才是最大值。

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

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

相关文章

数据结构(二) 线性表

2024年5月13日一稿 线性表的定义与基本操作 数据类型相同(各个元素占用空间相同) 是有限序列 基操

【Jenkins】Pipeline流水线语法解析全集 -- 声明式流水线

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

测试平台开发之测试框架改造并发执行及结果隔离(1)

1、准备测试框架 接口测试框架&#xff1a;api_framework.zipUI测试框架 1、当拿到上面这个zip文件之后需要进行解压&#xff0c;解压到这里 2、安装依赖 在解压后的这个项目路径下面新建一个requirements.txt 接下来通过pdm照着requirements里面的库进行安装 pdm add allu…

GPT-4o--真AI助手来临,可免费使用!

​ 今天凌晨&#xff0c;OpenAI又双缀缀发大招了&#xff0c;直接放出新的模型–GPT-4o&#xff0c;并号称可以实时对音频、视觉和文本进行推理。现场直播效果非常炸裂&#xff0c;能听、说、看&#xff0c;而且几乎没有延迟。 在GPT-4o出来以前&#xff0c;GPT也有语音对话功…

智慧畜牧:RFID技术在现代屠宰场的应用

智慧畜牧&#xff1a;RFID技术在现代屠宰场的应用 RFID猪肉溯源管理解决方案是一种利用无线射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术来实现猪肉从养殖、屠宰到销售整个供应链过程中的追踪与追溯的现代化管理手段。这一方案通…

Windows Qt中支持heic 图片显示

安装vcpkg&#xff1a; git clone https://github.com/microsoft/vcpkg 执行脚本&#xff1a; .\vcpkg\bootstrap-vcpkg.bat 在安装之前如果需要指定vs的编译器&#xff0c; 在如下文件中做更改&#xff0c; 我指定的是用vs2019编译的&#xff1a; D:\vcpkg\vcpkg\triplets 增…

LeetCode 0994.腐烂的橘子:广度优先搜索(BFS)

【LetMeFly】994.腐烂的橘子&#xff1a;广度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/rotting-oranges/ 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子…

vue+vant项目0-1快速发布到--钉钉应用

uniapp开发笔记----vue开发项目配置钉钉应用 一、 vuevant开发项目1. 自定义vuevant项目或者已经有的旧项目1. 自定义vuevant项目1. 创建vue项目2. 安装依赖3. 引入所有组件4. 使用一个组件/效果和代码如下&#xff1a; 2. git官网仓库&#xff0c;直接拉默认dome代码3. 打包项…

RS8551XF功能和参数介绍及PDF资料

RS8551XF是Runic&#xff08;润石&#xff09;公司生产的一款精密运算放大器。以下是关于RS8551XF的一些技术参数和特点&#xff1a; 类型&#xff1a;精密运算放大器 品牌&#xff1a;Runic&#xff08;润石&#xff09; 输入偏置电流&#xff1a;极低&#xff08;适合精密测量…

GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割

不同场景下的带注释的触觉铺装示例: GRFB-UNet网络结构: GRFB模块的结构: 铺路在视障人士的旅行中起着至关重要的作用。因此,识别铺装的形状和位置以支持视障人士的移动性是相当有意义的,而视觉分割技术就适合这项任务。为了有效提高触觉铺装分割的精度和鲁棒性,…

AMEYA360:纳芯微推出高性价比的推挽变压器驱动NSIP605x系列,支持客户多样化灵活设计

纳芯微今日宣布推出高性价比的推挽变压器驱动NSIP605x系列。该系列包括输出功率为1W的NSIP6051和输出功率为5W的NSIP6055。其中&#xff0c;NSIP6055提供两个版本&#xff1a;开关频率为160kHz的NSIP6055A&#xff0c;可用于对EMI要求更严格的系统应用;以及开关频率为420kHz的N…

【云原生】Kubeadm搭建K8S

一、部署Kubernetes 实验环境 服务器主机名IP地址主要组件k8s集群master01 etcd01master01192.168.10.100kube-apiserver kube-controller-manager kube-schedular etcdk8s集群node01 etcd02node01192.168.10.101kubelet kube-proxy docker flannelk8s集群node02 etcd03nod…