这道题看起来题目挺唬人的,其实和机器人走方格时一道题,只是状态转移方程不同。
我开始打算用递归写,每个节点寻求其四个方向上的节点的加号标志,这样的话会形成无线递归,用矩阵的四个边界根本封不住,类似于a节点去找b节点,求解b节点的时候反过来还需要去找a节点,这种无限递归不是太好发现,直到栈溢出才发现。
我换了思路,每个节点十字的个数并不应该把四周节点的十字个数求出来,只需要求出上面节点的上面有几个就行。比如a节点上面的b节点是1,b的上面有两个1,b的右边是0,对于b来说,它的十字个数是1,因为只有自己才能形成,但是对于a节点来说,他只关心竖直方向上有几个1,至于b的十字个数等于几并无所谓。这样做的话,需要左上到右下一波,右下到左上再来一波,就能把每个节点的上下左右都算出来,每个节点的加号数等于上下左右的最小值,所有节点取个max就ok了。
还有,注意第40行,我是有OJ没过才发现的这个问题。这个初始值不能等于0,因为这种写法,basecase中的可能性没算呢,如果把mmax传进basecase中看起来代码就很乱,正好N和mines是有关系的,索性就这么处理了。

class Solution {
public:
class Node
{
public:int left;int right;int up;int down;Node(int _left, int _right, int _up, int _down):left(_left),right(_right),up(_up),down(_down){};Node(int _node):left(_node),right(_node),up(_node),down(_node){};int minnum(void){return min(min(left,right),min(up,down));}
};void basecase(vector<vector<int> >&a, vector<vector<Node> >&b)
{int n = (int)a.size();for(int i=0;i<n;++i){b[0][i] = Node(a[0][i]);b[i][0] = Node(a[i][0]);b[n-1][i] = Node(a[n-1][i]);b[i][n-1] = Node(a[i][n-1]);}return;
}int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {if(mines.empty())return (int)floor(N/2);vector<vector<int> >a(N,vector<int>(N,1));vector<vector<Node> >b(N,vector<Node>(N,Node(-1,-1,-1,-1)));for(size_t i=0;i<mines.size();++i)a[mines[i][0]][mines[i][1]] = 0;int mmax = mines.size()==N*N ? 0 : 1;basecase(a,b);for(int i=1;i<=N-2;++i){for(int j=1;j<=N-2;++j){if(0 == a[i][j])b[i][j] = Node(0);elseb[i][j] = Node(b[i][j-1].left+1, -1, b[i-1][j].up+1, -1);}}for(int i=N-2;i>=1;--i){for(int j=N-2;j>=1;--j){if(1 == a[i][j]){b[i][j].right = b[i][j+1].right + 1;b[i][j].down = b[i+1][j].down + 1;}mmax = max(mmax, b[i][j].minnum());}}return mmax;
}};

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. leetcode 764. Largest Plus Sign | 764. 最大加号标志(Java)

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

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

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

  7. 764、最大加号标志

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

  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. Deep Residual Learning for Image Recognition(MSRA-深度残差学习)
  2. 12.Linux:exec函数族
  3. 学习Python一定要知道的在定义变量中的三个特征
  4. how to debug connector indexing
  5. 连接linux工具有哪些_推荐 10 个不错的网络监视工具,值得收藏
  6. Mybatis中的延迟加载的使用方法
  7. 计算机网络学习笔记(13. OSI参考模型①)
  8. 2018 蓝桥杯省赛 B 组模拟赛(五)题 B题
  9. 陈怡暖:FED决议措辞偏鹰,黄金先扬后抑险守千二关
  10. 解决Google-Chrome浏览器无法打开Kubernetes-K8S-Dashboard页面
  11. 阿里云推出网盘App,开放申请!非会员下载 10MB/s! 还有更厉害的:60M/s
  12. centos 如何查看操作系统是哪个版本
  13. 大学计算机excel函数课件,二级计算机考试Excel函数PPT课件
  14. git配置错误 ssh: connect to host github.com port 22: Connection refused
  15. js把数据导出成excel的中文乱码问题解决
  16. uniapp购物车界面模板
  17. Windows 如何调用ACPI Method---驱动开发
  18. Android 系统内置下载器服务 DownloadManager 的使用
  19. 系统分析师-系统设计
  20. 在线CAD-webpack使用插件入门

热门文章

  1. vue上下全屏翻页_全屏翻页布局
  2. 服务器系统安装优盘启动工具,u盘启动大师在Win10上安装和卸载远程服务器管理工具的方法...
  3. 自动抢票之 12306 登录篇
  4. matlab画伯德图开环程序,matlab伯德图开环闭环
  5. 计算机应用在航天,国产CPU的航天计算机应用
  6. 机器视觉光源概述(选型参考)
  7. python生日悖论,Python的生日悖论
  8. 04、Netty学习笔记—(黏包半包及协议设计解析)
  9. 假如古代皇帝也懂负载均衡算法
  10. 谷歌生物医学专用翻译_[Windows]学生党福利,文献翻译神器,附有生物医学专用引擎哦!...