文章目录
- 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
解释:这里有 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的次数
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阿明),一起加油、一起学习进步!