750. Number Of Corner Rectangles
Problem description:
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:1
2
3
4
5
6
7Input: 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:1
2
3
4
5
6Input: 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:1
2
3
4Input: grid =
[[1, 1, 1, 1]]
Output: 0
Explanation: Rectangles must have four distinct corners.
Note:
The number of rows and columns of grid will each be in the range [1, 200].
Each grid[i][j] will be either 0 or 1.
The number of 1s in the grid will be at most 6000.
Solution:
- Naive solution:
Find four corner points by traversing the grid in $O(m^2 * n^2)$ time.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28class Solution {
public:
int countCornerRectangles(vector<vector<int>>& grid) {
//find corners start from top-left
//only need four corner points to be 1
int m= grid.size(), n= grid[0].size(), res= 0;
for(int i= 0; i< m; i++){
for(int j= 0; j< n; j++){
if(grid[i][j] == 0) continue;
//no need to continue if top-left is 0
printf("i, j grid[%d][%d] is 1\n", i, j);
for(int p= i+1; p< m; p++){
if(grid[p][j] == 0) {
printf("grid[%d][%d] is 0\n", p, j);
continue;
}
printf("grid[%d][%d] is 1\n", p, j);
for(int q= j+1; q< n; q++){
res+= grid[p][q] && grid[i][q];
}
}
}
}
return res;
}
};
time complexity: $O()$
space complexity: $O()$
reference:
https://goo.gl/iFofQc