这道题的思路不是很难,就是要挨个算距离,然后做一个表,用排列组合的A算所求的值。问题在于,这道题,可以说是时间换内存。由于平方的数很大,如果你在for的最外边用map,内存是不够的,所以要在第一个平方里面用,会造成一些时间上的重复,ab ba都要算
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int re=0;
for(int i=0;i<points.size();i++)
{
unordered_map<long,int> summary;
for(int j=0;j<points.size();j++)
{
if(i==j)
continue;
int a=points[i].first-points[j].first;
int b=points[i].second-points[j].second;
int key=a*a+b*b;
summary[key]++;
}
for(auto a:summary)
{
re+=a.second*(a.second-1);
}
}
return re;
}
};
这个很机智,每当要增加一个数,就加上前面的的数*2,比如原来是n,n*(n-1),现在是n+1,(n+1)*(n),相减就是2*n
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int booms = 0;
for (auto &p : points) {
unordered_map<double, int> ctr(points.size());
for (auto &q : points)
booms += 2 * ctr[hypot(p.first - q.first, p.second - q.second)]++;
}
return booms;
}