题目描述:
Given a grid where each entry is only 0 or 1, find the number of corner rectangles.
A corner rectangle is 4 distinct 1s on the grid that form an axis-aligned rectangle. Note that only the corners need to have the value 1. Also, all four 1s used must be distinct.
Example 1:
Input: grid =
[[1, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 1]]
Output: 1
Explanation: There is only one corner rectangle, with corners grid[1][2], grid[1][4], grid[3][2], grid[3][4].
Example 2:
Input: grid =
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]
Output: 9
Explanation: There are four 2x2 rectangles, four 2x3 and 3x2 rectangles, and one 3x3 rectangle.
Example 3:
Input: grid =
[[1, 1, 1, 1]]
Output: 0
Explanation: Rectangles must have four distinct corners.
Note:
1. The number of rows and columns of grid will each be in the range [1, 200].
2. Each grid[i][j] will be either 0 or 1.
3. The number of 1s in the grid will be at most 6000.
Corner rectangle的定义是四个顶点都为1即可,所以我们只需要计算一共有多少种顶点组合。 可以枚举两行,然后看这两行同一列有多少个1,进行组合。
class Solution {
public:
int countCornerRectangles(vector<vector<int>>& grid) {
if(grid.size()==0||grid[0].size()==0) return 0;
int m=grid.size();
int n=grid[0].size();
int result=0;
for(int i=0;i<m;i++)
{
for(int j=i+1;j<m;j++)
{
int count=0;
for(int k=0;k<n;k++)
if(grid[i][k]==1&&grid[j][k]==1) count++;
result+=count*(count-1)/2;
}
}
return result;
}
};