前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 750. 角矩形的数量(DP)

LeetCode 750. 角矩形的数量(DP)

作者头像
Michael阿明
发布2020-07-13 14:37:12
1K0
发布2020-07-13 14:37:12
举报

1. 题目

给定一个只包含 0 和 1 的网格,找出其中角矩形的数量。

一个「角矩形」是由四个不同的在网格上的 1 形成的轴对称的矩形。 注意只有4角的位置才需要为 1。并且,4 个 1 需要是不同的。

代码语言:javascript
复制
示例 1:
输入:grid = 
[[1, 0, 0, 1, 0],
 [0, 0, 1, 0, 1],
 [0, 0, 0, 1, 0],
 [1, 0, 1, 0, 1]]
输出:1
解释:只有一个角矩形,角的位置为 grid[1][2], grid[1][4], grid[3][2], grid[3][4]。

示例 2:
输入:grid = 
[[1, 1, 1],
 [1, 1, 1],
 [1, 1, 1]]
输出:9
解释:这里有 4 个 2x2 的矩形,4 个 2x3 和 3x2 的矩形和 1 个 3x3 的矩形。

示例 3:
输入:grid = 
[[1, 1, 1, 1]]
输出:0
解释:矩形必须有 4 个不同的角。
 
提示:
网格 grid 中行和列的数目范围为 [1, 200]。
每个网格 grid[i][j] 中的值不是 0 就是 1 。
网格中 1 的个数不会超过 6000。

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

2. 解题

  • dp[c1][c2] 表示两列为 c1, c2 的时候,前缀n行的该两列同时为1的次数
代码语言:javascript
复制
class Solution {
public:
    int countCornerRectangles(vector<vector<int>>& grid) {
    	int m = grid.size(), n = grid[0].size(), r, c1, c2, count = 0;
        vector<vector<int>> dp(n, vector<int>(n, 0));
        for(r = 0; r < m; ++r)
        {
        	for(c1 = 0; c1 < n; ++c1)
        	{
        		if(grid[r][c1])
        		{
        			for(c2 = c1+1; c2 < n; ++c2)
        			{
        				if(grid[r][c2])
        				{
        					count += dp[c1][c2];
        					dp[c1][c2]++;
        				}
        			}
        		}
        	}
        }
        return count;
    }
};

184 ms 22.7 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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