1. 题目

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成正方形 子矩阵的个数。

示例 1:
输入:matrix =
[[0,1,1,1],[1,1,1,1],[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.示例 2:
输入:matrix =
[[1,0,1],[1,1,0],[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.提示:
1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:
LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)
LeetCode 5655. 重新排列后的最大子矩阵(前缀和+排序)

  • dp[i][j] 表示 以(i,j)右下角的最大正方形边长
  • 第一行、第一列肯定最大是1(矩阵值为1的话)
  • 其他为 1 位置的最大边长跟它相邻的几块的关系:等于左上方向3个最短的边长+1
  • 正方形的个数等于最大的边长
class Solution {public:int countSquares(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size(), i, j, count = 0;vector<vector<int>> dp(m,vector<int>(n,0));//dp[i][j] 表示 以i,j为右下角的最大正方形边长for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){if(i==0 || j==0)dp[i][j] = matrix[i][j];//最多边长1else if(matrix[i][j]==1)dp[i][j] = 1+min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]));count += dp[i][j];}}return count;}
};

另评论区Gremist优化了内存,原地算法

class Solution {public:int countSquares(vector<vector<int>>& matrix) {int ans = 0;for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < matrix[0].size(); j++) {if (i && j && matrix[i][j]) {matrix[i][j] += min({matrix[i-1][j-1], matrix[i-1][j], matrix[i][j-1]});}ans += matrix[i][j];}}return ans;}
};

LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)相关推荐

  1. C语言求最大正方形子矩阵,动态规划—统计全为1的正方形子矩阵个数|最大正方形...

    最大正方形 (统计全为 1 的正方形子矩阵) 解析可以参考leetcode解析 public class Solution { public int countSquares(int[][] matr ...

  2. leetcode算法题--统计全为 1 的正方形子矩阵

    原题链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/ 相关题目:最大正方形 动态规划O(m * n ...

  3. leetcode1277. 统计全为 1 的正方形子矩阵(dp)

    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数.示例 1:输入:matrix = [[0,1,1,1],[1,1,1,1],[ ...

  4. LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat , 请你返回有多少个 子矩形 的元素全部都是 1 . 示例 1: 输入:mat ...

  5. leetcode题库1277-- 统计全为 1 的正方形子矩阵

    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1,1,1,1] ...

  6. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  7. LeetCode 1641. 统计字典序元音字符串的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请返回长度为 n .仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量. 字符串 s 按 字典序排列 需要满足 ...

  8. 5454. 统计全 1 子矩形(Leetcode 196周赛)

    5454. 统计全 1 子矩形 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 . 示例 1: 输入:mat = [[1,0 ...

  9. leetCode最短补全词

    leetCode最短补全词 题目要求如下: 给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 . 补全词 是一个包含 licens ...

最新文章

  1. 阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”
  2. Android 8.0 运行时权限策略变化和适配方案
  3. AI时代的神马搜索!神马智能对话技术深度解读
  4. 如何写计算机会议的rebuttal
  5. 隐式类型转换中显式申明的非必要性
  6. 华强北二手手机卖不出去,闲鱼砸一亿现金帮扶
  7. C语言中定义整形可以连等吗,关于一道分解整数为N个连数整数的编程题
  8. MongoDB aop 日志
  9. 浅谈Netty相关概念
  10. 软件工程需求分析模板(简单)
  11. 很多的计算机英语词汇是通过,计算机英语词汇隐喻分析
  12. kali下java,kali java安装
  13. 快速部署支持 Makedown 和 LaTeX 等格式的 Zbox-Wiki 文档共享站点
  14. 或非门sr锁存器_sr锁存器的工作原理
  15. html help文档制作,HTML Help Workshop(文件制作工具)
  16. python 多态app_多态简介 | Python从入门到精通:高阶篇之三十三-阿里云开发者社区...
  17. 踩坑记--hexo中加入音乐
  18. 汉字转换成NCR编码的字符
  19. ParaView Visualizer 在ubuntu22.04环境下快速开发入门指南
  20. 人工智能不止会批改作业,它还在改变“一刀切”的教学模式

热门文章

  1. xcode8 快捷键失效
  2. java arraylist string_在Java ArrayList String中使用contains
  3. 精读linux源码,Linux基础入门的操作精读.doc
  4. 团队Alpha冲刺(三)
  5. Http协议之报文·方法·状态码
  6. [linux]服务器apache配置vhost
  7. 04_类与对象_课程动手动脑问题以及课后实验性问题及解答集锦
  8. show一下自己的文档编写功底
  9. C# 6.0语法新特性体验(二)
  10. 随想,对嵌入式职场建议