[
math
geometry
]
Leetcode 2013. Detect Squares
Problem statement
https://leetcode.com/problems/detect-squares/
Solution
The idea is to keep two pieces of infromation:
self.dis counter for points, that is how many times we have each of them.self.x_coordis defaultdict of counter for each coordinatex, that is givenxwe can quickly find all point with this coordinate.
What we need to do now:
- for
add(self, point)we just increment two counters. - for
count(self, point)we need to find all points with the same coordinatex: points in the form(x, y2)and then reconstruct square: there will be two ways to do it: one above line and one below. Here we need to take into account frequences of our points, so we useself.dfor this. Be careful to check thaty2 != y, it costs me 5 minutes penalty on the contest.
Complexity
Time complexity of add is O(1). Time complexity of count is potentially O(n) but in practice it is less because usually we do not have a lot of points on the same line. Space complexity of all data structure is O(n).
Code
class DetectSquares:
def __init__(self):
self.d = Counter()
self.x_coord = defaultdict(Counter) # x -> all y coordinates with freqs
def add(self, point):
x, y = point
self.d[x, y] += 1
self.x_coord[x][y] += 1
def count(self, point):
x, y = point
ans = 0
for y2 in self.x_coord[x]:
if y == y2: continue
ans += self.d[x, y2] * self.d[x + y2 - y, y] * self.d[x + y2 - y, y2]
ans += self.d[x, y2] * self.d[x + y - y2, y] * self.d[x + y - y2, y2]
return ans