Given n points in the plane that are all pairwise distinct, a “boomerang” is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters).
Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).
Example:
Input:
[[0,0],[1,0],[2,0]]
Output:
2
Explanation:
The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
一看500个点,直接暴力,结果gg了
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int ans=0;
int num=points.size();
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
if(j!=i){
for(int k=0;k<num;k++){
if(k!=i && k!=j){
int dis1=getdistance(points[i],points[j]);
int dis2=getdistance(points[i],points[k]);
if(dis1==dis2){
ans++;
}
}
}
}
}
}
return ans;
}
int getdistance(pair<int,int>p1,pair<int,int>p2){
int x=(p1.first-p2.first)*(p1.first-p2.first);
int y=(p1.second-p2.second)*(p1.second-p2.second);
return x+y;
}
};
提交,发现其中一个超时,,
然后继续优化,首先考虑减少一层循环
然后考虑不然纪录中垂线吧 结果遇到平行坐标轴的情况不好处理
怎么办
因为每个点都不一样,不然就纪录距离吧
这样子花空间让时间上快了
class Solution {
public:
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int ans=0;
int num=points.size();
for(int i=0;i<num;i++){
map<int,int> mp;
for(int j=0;j<num;j++){
if(j==i) continue;
int dis=getdistance(points[i],points[j]);
mp[dis]++;
}
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();++it){
if(it->second>=2){
ans+=it->second*(it->second-1);
}
}
}
return ans;
}
int getdistance(pair<int,int> p1,pair<int,int>p2){
int x=(p1.first-p2.first)*(p1.first-p2.first);
int y=(p1.second-p2.second)*(p1.second-p2.second);
return x+y;
}
};
顺带简单的学习了下map 以及遍历
for(it=mp.begin();it!=mp.end();++it){
if(it->second>=2){
ans+=it->second*(it->second-1);
}
}
越来越发现超时的时候用空间转化时间是常见的方法之一。