在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[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,无效元素为0,简单来说就是1能组成的‘+’的最大长度。

对于任意一个位置,能够组成‘+’的最大长度取决于上下左右方向的最小长度,那么对于任意一个点:

  • dp[i][j] = MIN(dp[i-1][j],dp[i+1][j],dp[i][j+1],dp[i][j-1]) + 1,其中 dp[i][j] 表示当前位置 1 的个数

必然满足该公式,但如何进行遍历?对于任意一个点,我们必须先知道上下左右才能推导当前位置,将问题简单化:

  • 如果当前节点 dp[i][j] = MIN(dp[i-1][j],dp[i][j-1]) + 1 我们只需要从头开始推导就可以推导出 dp[i][j]
  • 如果当前节点 dp[i][j] = MIN(dp[i+1][j],dp[i][j+1]) + 1 我们只需要从尾开始推导就可以推导出 dp[i][j]

我们可以将每一个dp[i][j]所需要的dp子元素分开推导,每一次只推导一个或者两个或者更多,在最优的情况下推导更多的子元素。

#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))int orderOfLargestPlusSign(int n, int** mines, int minesSize, int* minesColSize){int dp[n][n];memset(dp, -1, sizeof(dp));int max = 0;for (int i = 0; i < minesSize; i++) {dp[mines[i][0]][mines[i][1]] = 0;}//初始化变量并赋值 0 for (int i = 0; i < n; i++) {//枚举行子元素for (int j = 0; j < n; j++) {//第一次先初始化,当然也可以定义dp数组时初始化,都差不多if ((i == 0 || j == 0 || i == n-1 || j == n-1) && dp[i][j] != 0) {dp[i][j] = 1;max = 1;continue;}if (dp[i][j] != 0) {//行处理,dp[i][j-1] + 1; dp[i][j] = dp[i][j-1] + 1; }}if (i == 0 || i == n-1) {continue;}int count = 0;for (int j = n - 1; j >= 0; j--) {//行处理,相当于dp[i][j+1] + 1; if (dp[i][j] == 0) count = 0;if (dp[i][j] != 0) {++count;dp[i][j] = MIN(dp[i][j], count);}}}for (int j = 1; j < n-1; j++) {//枚举列子元素int count = 0;for (int i = 0; i < n; i++) {//列处理,边界就不需要处理了,相当于dp[i-1][j]if (dp[i][j] == 0) count = 0;if (dp[i][j] != 0) {++count;dp[i][j] = MIN(dp[i][j], count);}}count = 0;for (int i = n-1; i >= 0; i--) {//相当于dp[i+1][j]if (dp[i][j] == 0) count = 0;if (dp[i][j] != 0) {++count;dp[i][j] = MIN(dp[i][j], count);}max = MAX(max, dp[i][j]);}}return max;
}

764、最大加号标志相关推荐

  1. leetcode - 764. 最大加号标志

    764. 最大加号标志 -------------------------------------------- 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 ...

  2. Java实现 LeetCode 764 最大加号标志(暴力递推)

    764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...

  3. LeetCode 764. 最大加号标志(DP)

    文章目录 1. 题目 2. 解题 1. 题目 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 ...

  4. ​力扣解法汇总764. 最大加号标志

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  5. 764. 最大加号标志

    这道题看起来题目挺唬人的,其实和机器人走方格时一道题,只是状态转移方程不同. 我开始打算用递归写,每个节点寻求其四个方向上的节点的加号标志,这样的话会形成无线递归,用矩阵的四个边界根本封不住,类似于a ...

  6. leetcode 764. Largest Plus Sign | 764. 最大加号标志(Java)

    题目 https://leetcode.com/problems/largest-plus-sign/ 题解 class Solution {public int orderOfLargestPlus ...

  7. LeetCode第 764 题:最大加号标志(C++)

    764. 最大加号标志 - 力扣(LeetCode) 题目读懂都需要点时间 和LeetCode第 221 题:最大正方形(C++)_zj-CSDN博客有点类似,但是如果以某个点为+的中心考虑dp的话, ...

  8. 算法---最大加号标志

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

  9. leetcode算法题--最大加号标志★

    原题链接:https://leetcode-cn.com/problems/largest-plus-sign/ 动态规划 dp[i][j]表示从上下左右四个方向到[i,j]这个点的最小累积 状态转移 ...

最新文章

  1. jQuery中的事件机制深入浅出
  2. 关于Node.js中安装完express后不能使用express命令
  3. tdd干扰波形_LTE常见干扰排查(中国移动)
  4. PHP经常使用正則表達式汇总
  5. Oracle Database 11g Express Edition使用限制,与其他版本的区别
  6. 《零基础》MySQL 正则表达式(二十一)
  7. Postman Forbidden (CSRF token missing or incorrect.)
  8. 工作绩效数据、工作绩效信息和工作绩效报告的区别
  9. 【Flink】flink Operator State 的使用及Redistribute listState UnionListState
  10. python软件不用买吗_Python 3.3+中的软件包不需要__init__.py吗
  11. 解读【ICLR2020】多伦多大学:基于策略网络的探索模型规划
  12. Ruby+watir自动化测试中实现识别验证码图片
  13. java上路系列之一
  14. QT学习五之界面切换
  15. 使用Python Tkinter开发GPGGA的坐标转换工具
  16. Eclipse添加GBK编码
  17. Juniper JunOS PPPOE配置
  18. 矩阵补全(Matrix Completion)和缺失值预处理
  19. 使用docker创建属于你的ChatGPT
  20. 在项目中遇到导入TXT乱码现象。为什么UTF-8不行?ANSI是什么编码?

热门文章

  1. 【计算机图形学】图形显示设备
  2. Docker 入门看这一篇就够了!
  3. 回信-关于嵌入式开发
  4. 教育培训机构教培管理系统后台点名上课管理K12招生教学教务财务等全方位运营
  5. linux修改主机名(永久)
  6. DNGuard HVM RC3(主程序、运行库ASP.Net兼容性更新)
  7. UA287Q蓝牙模组,UA800 Wi-Fi模组助力扫地机器人方案,为传统电器插上“智能”翅膀
  8. html网页在不同尺寸屏幕大小,移动端h5页面不同尺寸屏幕适配方法
  9. 顺时针旋转矩阵的两种方法
  10. hap的布局col-xs-12