0
点赞
收藏
分享

微信扫一扫

[hashmap嵌套]leetcode2013:检测正方形(medium)

圣杰 2022-01-26 阅读 26

题目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


题解:
在这里插入图片描述


代码如下:

class DetectSquares {
public:
    // 使用哈希表嵌套,{y,{x,{点(x,y)的个数}}}
    unordered_map<int,unordered_map<int,int>> cnt;
    DetectSquares() {

    }
    
    void add(vector<int> p) {
        int x=p[0],y=p[1];
        cnt[y][x]++;
    }
    
    int count(vector<int> p) {
        int res=0;
        int x=p[0],y=p[1];
        if(!cnt.count(y))return 0;
        // 获得点(x,y)的点y的x的个数
        unordered_map<int,int> y_cnt=cnt[y];
        // 遍历寻找x行的非y列的所有点,即(x,ny)
        for(auto &[ny,ny_cnt]:cnt){
            if(ny==y)continue;
            int len=ny-y;
            for(int nx:{x-len,x+len}){
                // (nx,y) * (x,ny) * (nx,ny)
                // y_cnt表示y点,ny_cnt表示ny点,然后再y点的集合中选nx的点,再ny的集合中选nx,x的点
                res+=(y_cnt.count(nx)?y_cnt[nx]:0)*(ny_cnt.count(x)?ny_cnt[x]:0)*(ny_cnt.count(nx)?ny_cnt[nx]:0);
            }
        }
        return res;
    }
};
// 静态数组实现
const int N = 1010;
class DetectSquares {
public:
    int cnt[N][N];
    DetectSquares() {
        memset(cnt,0,sizeof cnt);
    }
    
    void add(vector<int> p) {
        cnt[p[0]][p[1]]++;
    }
    
    int count(vector<int> p) {
        int res=0;
        int x=p[0],y=p[1];
        // 枚举x行的平行点
        for(int ny=0;ny<N;++ny){
            if(ny==y)continue;
            int c1=cnt[x][ny];
            if(c1==0)continue;
            int len=ny-y;
            for(int nx:{x-len,x+len}){
                if(nx<0||nx>=N)continue;
                int c2=cnt[nx][y],c3=cnt[nx][ny];
                res+=c1*c2*c3;
            }
        }
        return res;
    }
};
举报

相关推荐

0 条评论