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

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

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

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

示例 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
解释:这里有 42x2 的矩形,42x3 和 3x2 的矩形和 13x3 的矩形。

示例 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的次数
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


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

你可能感兴趣的:(LeetCode)