这道题,有几点:
1、首先固定一个点,然后求其他点到这个点的距离集合,
2、在这个距离集合中,相等距离的有m个,则回旋镖数就有组合C(m, 2) * 2个,
3、回到步骤1
有个优化的方法,在存储距离的时候,可以使用map来存储,来减少求相等距离的时间,效率提高的还是特别大的
方法一,不适用map来存距离,用vector存储:
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
long len = points.size();
if(len == 0 || len == 1)
return 0;
vector<double> distance;
int ret = 0;
vector<int> visit;
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++)
distance.push_back(sqrt(pow(points[i].first-points[j].first, 2) + pow(points[i].second - points[j].second, 2)));
visit.resize(distance.size());
for(int k = 0; k < distance.size(); k++){
if(!visit[k]){
visit[k] = 1;
int cnt = 1;
for(int j = k + 1; j < distance.size(); j++){
if(!visit[j]){
if(distance[j] == distance[k]){
visit[j] = 1;
cnt++;
}
}
}
if(cnt >= 2)
ret += (cnt * (cnt - 1));
}
}
distance.clear();
visit.clear();
}
return ret;
}
};
运行时间:1180ms
方法二:用map存储距离
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
long len = points.size();
if(len == 0 || len == 1)
return 0;
map<int, int> distance;
int ret = 0, x, y;
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
x = points[i].first-points[j].first; y = points[i].second - points[j].second;
distance[x*x + y*y]++;
}
for(auto it : distance)
ret += it.second * (it.second - 1);
distance.clear();
}
return ret;
}
};
运行时间:268ms
方法三: 使用undered_map来存储距离
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
long len = points.size();
if(len == 0 || len == 1)
return 0;
unordered_map<int, int> distance;
int ret = 0, x, y;
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
x = (points[i].first-points[j].first), y = (points[i].second - points[j].second);
distance[x*x + y*y]++;
}
for(auto it : distance)
ret += it.second * (it.second - 1);
distance.clear();
}
return ret;
}
};
运行时间: 156ms