447. 回旋镖的数量
计数问题,枚举i,统计与i坐标不同距离的坐标个数(哈希表保存),然后排列组合求结果。
假设有 \(m\) 个点到 \(points[i]\)距离相同,我们需要从这 $ m$个点中选择2个点作为另外两个点,由于考虑顺序,结果为 \(A_{m}^{2} = m *(m-1)\)
据此,我们可以遍历 \(points\),计算并统计所有点到 \(points[i]\) 的距离,将每个距离的出现次数记录在哈希表中,然后遍历哈希表,并用上述公式计算并累加回旋镖的个数。
class Solution {
public:
int dist(int i, int j, vector<vector<int>>& p){
return (p[i][0] - p[j][0]) * (p[i][0] - p[j][0]) + (p[i][1] - p[j][1]) * (p[i][1] - p[j][1]);
}
int numberOfBoomerangs(vector<vector<int>>& points) {
int res = 0, n = points.size();
for(int i = 0; i < n; ++i){
unordered_map<int,int>cnt;
for(int j = 0; j < n; ++j) ++cnt[dist(i, j, points)];
for(auto [_,v] : cnt)res += v * (v - 1);
}
return res;
}
};