Given a grid with only 0 and 1, find the number of corner rectangles.
Note that only the corners need to have the value 1. Also, all four 1s used must be distinct.
Example
Example 1:
Input:
[
[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:
[
[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: [[1,1,1,1]]
Output: 0
Explanation: Rectangles must have four distinct corners.
Notice
- The number of rows and columns of grid will each be in the range [1, 200][1,200].
- Each
grid[i][j]
will be either 0 or 1. - The number of 1s in the grid will be at most 6000.
分析
这道理在leetCode上是一道加密的题,但是我发现在lintCode上可以搜到相同的题目,而且可以提交。
这道题是要在grid中找到四个顶点都为1的矩形的数量。其实就是对比每两行两两之间有多少个纵坐标相同且为1的,如果第1行和第2行有3个,那么可以组成(3 * 2)/2 = 3个矩形。遍历整个grid,复杂度为O(n*n*m)。
Code
class Solution {
public:
/**
* @param grid: the grid
* @return: the number of corner rectangles
*/
int countCornerRectangles(vector<vector<int>> &grid) {
// Write your code here
int rows = grid.size();
if (rows == 0)
return 0;
int cols = grid[0].size();
int sum = 0;
for (int i = 0; i < rows - 1; i ++)
{
for (int j = i+1; j < rows; j ++)
{
int count = 0;
for (int k = 0; k < cols; k ++)
{
if (grid[i][k] == 1 && grid[j][k] == 1)
count ++;
}
sum += (count * (count -1))/2;
}
}
return sum;
}
};
运行效率
Your submission beats 72.84% Submissions!