题目:
题解:
代码如下:
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;
}
};