-
Notifications
You must be signed in to change notification settings - Fork 43
/
number-of-corner-rectangles.py
106 lines (92 loc) · 3.05 KB
/
number-of-corner-rectangles.py
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
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:
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.
"""
# V0
# V1
# http://bookshadow.com/weblog/2017/12/17/leetcode-number-of-corner-rectangles/
# IDEA : DP
# JAVA
# class Solution {
# public int countCornerRectangles(int[][] grid) {
# int m = grid.length, n = grid[0].length;
# int ans = 0;
# for (int x = 0; x < m; x++) {
# for (int y = x + 1; y < m; y++) {
# int cnt = 0;
# for (int z = 0; z < n; z++) {
# if (grid[x][z] == 1 && grid[y][z] == 1) {
# cnt++;
# }
# }
# ans += cnt * (cnt - 1) / 2;
# }
# }
# return ans;
# }
# }
# V1'
# https://www.jiuzhang.com/solution/number-of-corner-rectangles/#tag-highlight-lang-python
class Solution(object):
def countCornerRectangles(self, grid):
rows = [[c for c, val in enumerate(row) if val]
for row in grid]
N = sum(sum(row) for row in grid)
SQRTN = int(N**.5)
ans = 0
count = collections.Counter()
for r, row in enumerate(rows):
if len(row) >= SQRTN:
target = set(row)
for r2, row2 in enumerate(rows):
if r2 <= r and len(row2) >= SQRTN:
continue
found = sum(1 for c2 in row2 if c2 in target)
ans += found * (found - 1) / 2
else:
for pair in itertools.combinations(row, 2):
ans += count[pair]
count[pair] += 1
return ans
# V2
# Time: O(n * m^2), n is the number of rows with 1s, m is the number of cols with 1s
# Space: O(n * m)
class Solution(object):
def countCornerRectangles(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
rows = [[c for c, val in enumerate(row) if val]
for row in grid]
result = 0
for i in range(len(rows)):
lookup = set(rows[i])
for j in range(i):
count = sum(1 for c in rows[j] if c in lookup)
result += count*(count-1)/2
return result