前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)

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

作者头像
Michael阿明
发布2020-07-13 15:32:26
6200
发布2020-07-13 15:32:26
举报

1. 题目

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

代码语言:javascript
复制
示例 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 5454. 统计全 1 子矩形(记录左侧的连续1的个数)

  • dp[i][j] 表示 以(i,j)右下角的最大正方形边长
  • 第一行、第一列肯定最大是1(矩阵值为1的话)
  • 其他为 1 位置的最大边长跟它相邻的几块的关系:等于左上方向3个最短的边长+1
  • 正方形的个数等于最大的边长
代码语言:javascript
复制
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];//最多边长1
    			else 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优化了内存,原地算法

代码语言:javascript
复制
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;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档