https://leetcode-cn.com/problems/number-of-boomerangs/
思路:考虑枚举点
i
i
i,如果我们知道其他所有点到点
i
i
i的距离,那么可以计算出每个距离对应的点对数量
x
x
x,显然它对答案的贡献为
x
∗
(
x
−
1
)
x*(x-1)
x∗(x−1)——从
x
x
x个元素中有顺序的选出2个元素。通过哈希表可以把时间复杂度降低到
O
(
n
2
)
O(n^2)
O(n2)。不过计数方式有很多种,也可以考虑在统计点对数量的时候计算。
class Solution {
public:
int numberOfBoomerangs(vector<vector<int>>& points) {
int ans=0,n=points.size();
auto calDis=[&](int idx1,int idx2)->int
{
vector<int> &p1=points[idx1];
vector<int> &p2=points[idx2];
return ((p1[0]-p2[0])*(p1[0]-p2[0]))+((p1[1]-p2[1])*(p1[1]-p2[1]));
};
for(int i=0;i<n;i++)
{
unordered_map<int,int> cnt;
int sum=0;
for(int j=0;j<n;j++)
{
if(j==i)
continue;
int dis=calDis(i,j);
sum+=cnt[dis];
++cnt[dis];
}
ans+=sum<<1;
}
return ans;
}
};