【Leetcode-每日一题】检测正方形

检测正方形
难度:简单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于 add 操作,我们可以使用「哈希表 套 哈希表」的方式,以 {x, {y : 点 (x,y) 的数量}} 的形式对传入点进行存储。
对于 count 查询而言,假定传入的点为 (x, y),我们可以先查询 x 行都有哪些列,枚举这些列( 即枚举点 (x, ny) ),由 y 和 ny 可得正方形边长 lenlen,此时再检查唯一确定的两点 (x±len,y) 和 (x±len,ny) 的出现次数,应用乘法原理,即可知道该正方形的方案数,统计所有合法方案数即是该询问的答案。

代码如下:

class DetectSquares {
    
    Map<Integer, Map<Integer, Integer>> map = new HashMap<Integer, Map<Integer, Integer>>();
    public DetectSquares() {

    }
    
    public void add(int[] point) {
        int x = point[0];
        int y = point[1];
        Map<Integer, Integer> col2Cnt  = map.getOrDefault(x, new HashMap<>());
        col2Cnt.put(y,col2Cnt.getOrDefault(y,0)+1);
        map.put(x,col2Cnt);
    }

    public int count(int[] point) {
        int x = point[0];
        int y = point[1];
        Map<Integer, Integer> col2Cnt  = map.getOrDefault(x,new HashMap<>());
        int res = 0;
        //x 相等,即两点之间形成的直线与y轴平行
        for (Integer ny : col2Cnt.keySet()){
            if (ny==y) continue;
            int dif = ny - y;
            if (map.containsKey(x+dif)) {
                if (map.get(x+dif).containsKey(y) && map.get(x+dif).containsKey(ny)){
                    res += col2Cnt.get(ny) * map.get(x+dif).get(y) * map.get(x+dif).get(ny);
                }
            }
            if (map.containsKey(x-dif)) {
                if (map.get(x-dif).containsKey(y) && map.get(x-dif).containsKey(ny)){
                    res += col2Cnt.get(ny) * map.get(x-dif).get(y) * map.get(x-dif).get(ny);
                }
            }

        }
        return res;
    }
}

执行结果:成功
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值