class DetectSquares:
def __init__(self):
self.map = defaultdict(Counter)
def add(self, point: List[int]) -> None:
x, y = point
self.map[y][x] += 1
def count(self, point: List[int]) -> int:
res = 0
x, y = point
if not y in self.map:
return 0
yCnt = self.map[y]
for col, colCnt in self.map.items():
if col != y:
# 根据对称性,这里可以不用取绝对值
d = col - y
res += colCnt[x] * yCnt[x + d] * colCnt[x + d]
res += colCnt[x] * yCnt[x - d] * colCnt[x - d]
return res
题目要求判断当前点是否可以与已给出的点组成正方形
1.初始化defaultdict(Counter)
defaultdict()
是python提供了一种默认值字典的数据结构。它允许我们在定义字典时给所有不存在的key设置默认值,这样当取不存在的key时,就不会报错。
Counter
类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。
2.add()
增加点坐标,存储y轴所对应的x坐标,并统计相同x坐标出现的次数
3.count()
通过遍历之前的所有点的纵坐标的差值d
,这个d
就相当于正方形的边长,通过当前点坐标和边长可以计算出正方形的其他三个点的坐标,通过判断字典中三个点的坐标的乘积是否等于1,相当于判断其他三个点是否都存在,如果一个点出现了多次,那就可以判断为叠加的正方形,其中只要有一个点不存在值就为0。
4.其中要注意的是,通过一个点和边可以得出左下和右上分别两个正方形,都需要做判断。