【leetcode 每日打卡】2013. 检测正方形

在这里插入图片描述

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.其中要注意的是,通过一个点和边可以得出左下和右上分别两个正方形,都需要做判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值